未知容器时如何注册DLL的依赖项?

时间:2018-09-25 22:57:10

标签: c# .net dependency-injection inversion-of-control

我正在开发一个使用依赖注入和控件反转的类库。

据我了解,理想的IoC设置在主应用程序中仅具有单个合成根。该库应该向根目录注册其依赖项,因此我想公开一个允许主程序执行此操作的调用。呼叫可能看起来像这样:

void RegisterDependencies(Container container)
{
   ...

并这样称呼:

//In the main program (which we are not writing)
static Container CompositionRoot()
{
    var builder = new ContainerBuilder();

    //Main program registers its own dependencies
    builder.RegisterType<IMainProgramType, MainProgramClass>();

    //Main program calls library to register the library's dependencies
    MyLibrary.Root.RegisterDependencies(builder);  //<<<<< the call I want to enable

    return builder.Builder();
}

上述问题是RegisterDependencies调用必须接受一个包含IoC容器或用于构建它的对象的参数。但是编写该库的团队不知道主程序将使用哪个容器,我们也不想对其施加限制。

如何解决这个问题?是否存在我们可以公开的通用界面,例如

//In my library
void RegisterDepencendies(IStandardContainer container)

还是将其公开为代表?

//In my library
void RegisterDependencies(Action<object,object> registerAction)
{
    registerAction(typeof(IMyLibraryInterface), typeof(MyLibraryClass));
}

//In main program
MyLibrary.Root.RegisterDependencies( i,c => builder.RegisterType(i,c) );

还是我们应该放弃这种方法,让图书馆拥有自己的合成根目录和容器?

1 个答案:

答案 0 :(得分:0)

您可以让您的类库仅定义相关类型而无需引用任何特定的IoC库,并具有一个或多个针对特定IoC框架的程序包,并使用该框架的约定来定义默认注册。

I.E。您的项目结构如下:

  • MyLibrary(无依赖项)
  • MyLibrary.Autofac(取决于MyLibrary和Autofac)
  • MyLibrary.AspNetCore(取决于MyLibrary和Microsoft.Extensions.DependencyInjection)