2016-02-07 8 views
5

में ऑटोफ़ैक का उपयोग करें मेरे पास बड़ा wpf एप्लिकेशन है। मैं ऑटोफैक के साथ अपनी समस्या को सरल बना देता हूं। मान लें कि मेरे पास ViewModelLocator है जहां मैं contrainer बनाते हैं। ViewModelLocator Company.WPF प्रोजेक्ट में है, यह प्रोजेक्ट कंपनी। व्यूमोडल्स प्रोजेक्ट को संदर्भित करता है।एकाधिक प्रोजेक्ट समाधान

var builder = new ContainerBuilder(); 
builder.RegisterType<MainWindowViewModel>().AsSelf().SingleInstance(); 
container = builder.Build(); 

समस्या: MainWindowViewModel ICompanyService (मैं सीआई का उपयोग करें) जो Company.Services परियोजना में है की जरूरत है, इस परियोजना Company.WPF से संदर्भ नहीं होना चाहिए। ICompanyService सार्वजनिक है और उसी प्रोजेक्ट (कंपनी सर्विसेज) में कंपनी सेवा भी कार्यान्वित है, लेकिन यह केवल आंतरिक है।

मैं इनके लिए ऑटोफैक कैसे सेट कर सकता हूं? मैं आमतौर पर कास्ट विस्डर का उपयोग करता हूं, इन परिस्थितियों के लिए इंस्टॉलर हैं, ऑटोफैक में भी इसी तरह का विकल्प है?

उत्तर

5

आप ऑटोफैक में Modules की अवधारणा की तलाश में हैं। अपने आर्किटेक्चर में प्रत्येक परत के लिए आप उस परत के लिए एक नया ऑटोफैक मॉड्यूल जोड़ते हैं, जहां आप उस परत के प्रकार पंजीकृत करते हैं। आपके ViewModelLocator में, जहां आप अपना ऑटोफैक कंटेनर बनाते हैं, तो आप सीधे सभी प्रकार के पंजीकरण के बजाय ऑटोफैक मॉड्यूल पंजीकृत करते हैं।

और अधिक विस्तार में और अपने मामले के लिए यह कुछ इस तरह दिखाई दे सकता है:

अपने Company.Services परियोजना में:

आप कुछ इस तरह के साथ एक नया मॉड्यूल ServicesModule जोड़ें। :

public class ServiceModule : Autofac.Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
    // optional: chain ServiceModule with other modules for going deeper down in the architecture: 
    // builder.RegisterModule<DataModule>(); 

    builder.RegisterType<CompanyService>().As<ICompanyService>(); 
    // ... register more services for that layer 
    } 
} 

अपने Company.ViewModels परियोजना में:

तुम भी बनाने के एक ViewModelModule जहां आप अपने सभी ServiceModule के समान ViewModels रजिस्टर।

public class ViewModelModule : Autofac.Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
    // in your ViewModelModule we register the ServiceModule 
    // because we are dependent on that module 
    // and we do not want to register all modules in the container directly 
    builder.RegisterModule<ServiceModule>(); 

    builder.RegisterType<MainViewModel>().AsSelf().InSingletonScope(); 
    // ... register more view models 
    } 
} 

अपने Company.Wpf परियोजना (ViewModelLocator) में:

var builder = new ContainerBuilder(); 
builder.RegisterModule<ViewModelModule>(); 
builder.Build(); 

ध्यान दें कि जब से हम ViewModelModule भीतर ServiceModule पंजीकृत है, हम बस ContainerBuilder में सीधे ViewModelModule रजिस्टर करने के लिए है। Company.Wpf प्रोजेक्ट के भीतर Company.Service प्रोजेक्ट का संदर्भ जोड़ने की आवश्यकता नहीं है।

संबंधित मुद्दे