Stai cercando il concetto di Modules in autofac. Per ogni livello della tua architettura aggiungi un nuovo modulo autofac per quel livello, in cui registri i tipi di quel livello. Nel tuo ViewModelLocator
, dove costruisci il tuo contenitore di autofac, devi solo registrare i moduli di autofac invece di registrare tutti i tipi direttamente.
Più in dettaglio e per il vostro caso questo potrebbe essere simile a questa:
Nel progetto Company.Services
:
Si aggiunge un nuovo modulo ServicesModule
con qualcosa di simile. :
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
}
}
Nel progetto Company.ViewModels
:
È inoltre possibile creare un ViewModelModule
in cui si registra tutti i tuoi ViewModels simili al ServiceModule
.
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
}
}
Nel Company.Wpf
progetto (ViewModelLocator
):
var builder = new ContainerBuilder();
builder.RegisterModule<ViewModelModule>();
builder.Build();
Nota che da quando abbiamo registrato il ServiceModule
all'interno del ViewModelModule
, non ci resta che registrare il ViewModelModule
direttamente nel ContainerBuilder
. Questo ha il vantaggio di non dover aggiungere un riferimento al progetto Company.Service
all'interno del progetto Company.Wpf
.
fonte
2016-02-07 16:57:22