1

我正在使用 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 以及类似情况的最佳实践是什么。

谢谢

帕尔米德

4

1 回答 1

1
  1. 应用程序应该依赖于容器。例如,您经常更改应用程序中的 ORM?此类架构决策必须提前做出。

  2. 如果非常想摆脱具体的 IOC 容器,您可以在 Agatha 请求/响应服务层上查看 http://davybrion.github.com/Agatha/

  3. 使用 Autofac 模块代替 IDependencyBuilder。它更灵活。 https://code.google.com/p/autofac/wiki/StructuringWithModules

于 2013-03-06T09:34:43.610 回答