2016-02-07 18 views
5

Büyük wpf uygulamasına sahibim. Autofac ile problemimi basitleştiriyorum. Kontrendeyici oluşturduğum ViewModelLocator'um olduğunu varsayalım. ViewModelLocator Company.WPF projesinde, bu proje Company.ViewModels projesini ifade etmektedir.Birden çok proje çözümünde autofac kullanın

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

Sorun: MainWindowViewModel bu proje Company.WPF referans olmamalıdır Company.Services projede olduğu ICompanyService (I CI kullanın) ihtiyacı vardır. ICompanyService kamuya açık ve aynı proje (Company.Services) de CompanyService uygulama, ancak sadece iç.

Bunlar için Autofac'ı nasıl kurabilirim? Normalde castel Wisndor kullanıyorum, bu durum için montajcılar var, Autofac'da da benzer bir seçenek var mı?

cevap

5

Otofac içinde Modules konseptini arıyorsunuz. Mimarinizdeki her katman için, o katmanın türlerini kaydettiğiniz katman için yeni bir autofac modülü eklersiniz. Autofac kabınızı oluşturduğunuz ViewModelLocator ürününüzde, tüm türleri doğrudan kaydetmek yerine sadece autofac modülleri kaydedersiniz. senin Company.Services projede

:

Daha ayrıntılı olarak ve vaka için bu şuna benzer olabilir Böyle bir şey ile yeni bir modül ServicesModule eklemek

. : En Company.ViewModels projede

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 
    } 
} 

:

Ayrıca oluşturmak a ServiceModule benzer tüm ViewModels kayıt ViewModelModule. Biz ViewModelModule içinde ServiceModule kayıtlı beri, biz sadece ContainerBuilder doğrudan ViewModelModule kayıt zorunda

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

Not: En Company.Wpf proje (ViewModelLocator) olarak

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 
    } 
} 

. Bu, Company.Wpf projesinde Company.Service projesine bir başvuru eklemenin gerekmemesi avantajına sahiptir.

İlgili konular