我正在使用 autofac 作为 IOC 容器处理 asp.net mvc 项目。我有一个接口 IDependencyBuilder,如下所示。
public interface IDependencyBuilder
{
void Build(ContainerBuilder builder);
}
现在我的客户项目,如果他们需要提供一些实现,他们实现这个接口。例如。
public class SomeDependencyBuilder : IDependencyBuilder
{
public void Build(ContainerBuilder builder)
{
builder.RegisterType<FeedService>().As<IFeedService>();
}
}
现在,在我的启动过程中。我得到了 IDependencyBuilder 的所有实例并调用它们的 Build Method
public static void BuildModule(ContainerBuilder builder)
{
var type = typeof(IDependencyBuilder);
var types = AssemblyLocator.GetBinFolderAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p) && !p.IsInterface && !p.IsAbstract);
foreach (var type in types)
{
((IDependencyBuilder)Activator.CreateInstance(type)).Build(builder);
}
}
一切都很好。现在的问题是我必须在所有客户端项目中添加对 Autofac 库项目的引用。另外,如果我需要用其他一些 IOC 容器替换 autofac,我需要更改所有代码。所以这让我感觉很糟糕。我想要实现的是从客户端项目返回对象列表(实现和接口)并将它们注册到我的启动函数中。
public interface IDependencyBuilderNew
{
List<SomeObject> GetList();
}
现在启动功能应该是这样的
public static void BuildModule(ContainerBuilder builder)
{
var type = typeof(IDependencyBuilderNew);
var types = AssemblyLocator.GetBinFolderAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p) && !p.IsInterface && !p.IsAbstract);
foreach (var type in types)
{
var list =((IDependencyBuilderNew)Activator.CreateInstance(type)).GetList();
foreach(var l in list)
{
builder.RegisterType<l.Class>().As<l.InterFace>();
}
}
}
我将如何实现我的 SomeObject 以及类似情况的最佳实践是什么。
谢谢
帕尔米德