我正在开发一个使用依赖注入和控件反转的类库。
据我了解,理想的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) );
还是我们应该放弃这种方法,让图书馆拥有自己的合成根目录和容器?
答案 0 :(得分:0)
您可以让您的类库仅定义相关类型而无需引用任何特定的IoC库,并具有一个或多个针对特定IoC框架的程序包,并使用该框架的约定来定义默认注册。
I.E。您的项目结构如下: