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.