2016-02-07 8 views
5

Ich habe große wpf-Anwendung. Ich vereinfach mein Problem mit Autofac. Sagen wir, ich habe ViewModelLocator, wo ich Contrainer erstelle. ViewModelLocator befindet sich in Company.WPF-Projekt, dieses Projekt verweist auf Company.ViewModels-Projekt.Verwenden Sie Autofac in mehrere Projekt-Lösung

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

Problem: MainWindowViewModel muss ICompanyService (ich benutze CI), die in Company.Services Projekt ist, sollte dieses Projekt von Company.WPF nicht Bezug. ICompanyService ist öffentlich und in demselben Projekt (Company.Services) ist auch die Implementierung CompanyService, aber es ist nur intern.

Wie kann ich Autofac für diese einrichten? Ich benutze normalerweise castel Wisndor, es gibt Installateure für diese Situation, ist eine ähnliche Option in Autofac zu?

Antwort

5

Sie suchen nach dem Konzept von Modules in Autofac. Fügen Sie für jede Ebene in Ihrer Architektur ein neues Autofac-Modul für diese Ebene hinzu, in dem Sie die Typen dieser Ebene registrieren. In Ihrem ViewModelLocator, wo Sie Ihren Autofac-Container erstellen, registrieren Sie einfach Autofac-Module, anstatt alle Typen direkt zu registrieren.

Im Einzelnen und für Ihren Fall so etwas wie folgt aussehen könnte:

In Ihrem Company.Services Projekt:

fügen Sie ein neues Modul ServicesModule mit so etwas. :

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

In Ihrem Company.ViewModels Projekt:

Sie schaffen auch ein ViewModelModule wo Sie alle Ihre Viewmodel ähnlich die ServiceModule registrieren.

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

In Ihrem Company.Wpf Projekt (ViewModelLocator):

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

Beachten Sie, dass, da wir die ServiceModule im ViewModelModule registriert, wir müssen nur die ViewModelModule direkt im ContainerBuilder registrieren. Dies hat den Vorteil, dass kein Verweis auf das Projekt Company.Service innerhalb des Projekts Company.Wpf hinzugefügt werden muss.