我有大型的wpf应用程序。我用autofac简化了我的问题。假设我有ViewModelLocator,我创建了对手。 ViewModelLocator在Company.WPF项目中,该项目引用Company.ViewModels项目。
var builder = new ContainerBuilder();
builder.RegisterType<MainWindowViewModel>().AsSelf().SingleInstance();
container = builder.Build();
问题:MainWindowViewModel需要在Company.Services项目中的ICompanyService(我使用CI),该项目不应该是Company.WPF的引用。 ICompanyService是公共的,同一个项目(Company.Services)也是实现CompanyService,但它只是内部的。
如何为这些设置Autofac?我通常使用castel Wisndor,对于这些情况有安装程序,在Autofac中也有类似选项吗?
答案 0 :(得分:7)
您正在寻找autofac中Modules的概念。对于体系结构中的每个层,您可以为该层添加一个新的autofac模块,您可以在其中注册该层的类型。在构建autofac容器的ViewModelLocator
中,只需注册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
}
}
在您的Company.ViewModels
项目中
您还可以创建ViewModelModule
,在其中注册与ServiceModule
类似的所有ViewModel。
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
}
}
在您的Company.Wpf
项目中ViewModelLocator
):
var builder = new ContainerBuilder();
builder.RegisterModule<ViewModelModule>();
builder.Build();
请注意,由于我们在ServiceModule
内注册了ViewModelModule
,因此我们只需在ViewModelModule
中直接注册ContainerBuilder
即可。这样做的好处是无需在Company.Service
项目中添加对Company.Wpf
项目的引用。