Pet*_*Pan 6 .net wpf ioc-container autofac
我有大型的wpf应用程序.我用autofac简化了我的问题.假设我有ViewModelLocator,我创建了对手.ViewModelLocator在Company.WPF项目中,该项目引用Company.ViewModels项目.
var builder = new ContainerBuilder();
builder.RegisterType<MainWindowViewModel>().AsSelf().SingleInstance();
container = builder.Build();
Run Code Online (Sandbox Code Playgroud)
问题:MainWindowViewModel需要在Company.Services项目中的ICompanyService(我使用CI),该项目不应该从Company.WPF引用.ICompanyService是公共的,同一个项目(Company.Services)也是实现CompanyService,但它只是内部的.
如何为这些设置Autofac?我通常使用castel Wisndor,对于这些情况有安装程序,在Autofac中也有类似选项吗?
您正在寻找autofac中的模块概念.对于体系结构中的每个层,您可以为该层添加一个新的autofac模块,您可以在其中注册该层的类型.在您ViewModelLocator构建autofac容器的地方,您只需注册autofac模块,而不是直接注册所有类型.
更详细,对于您的情况,这可能看起来像这样:
在您的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
}
}
Run Code Online (Sandbox Code Playgroud)
在您的Company.ViewModels项目中:
您还可以创建一个ViewModelModule注册所有ViewModel的地方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
}
}
Run Code Online (Sandbox Code Playgroud)
在你的Company.Wpf项目中(ViewModelLocator):
var builder = new ContainerBuilder();
builder.RegisterModule<ViewModelModule>();
builder.Build();
Run Code Online (Sandbox Code Playgroud)
注意,既然我们注册了ServiceModule内部ViewModelModule,我们只需要ViewModelModule直接注册即可ContainerBuilder.这样做的好处是不需要在Company.Service项目中添加对项目的引用Company.Wpf.