在多个项目解决方案中使用autofac

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中也有类似选项吗?

M.E*_*.E. 7

您正在寻找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.