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

时间:2016-02-07 14:15:24

标签: .net wpf autofac ioc-container

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

1 个答案:

答案 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项目的引用。