Asp.net mvc 如何在所有项目中避免autofac引用

Asp.net mvc 如何在所有项目中避免autofac引用,asp.net-mvc,inversion-of-control,autofac,Asp.net Mvc,Inversion Of Control,Autofac,我正在使用autofac作为IOC容器进行asp.net mvc项目。我有一个界面IDependencyBuilder,如下所示 public interface IDependencyBuilder { void Build(ContainerBuilder builder); } 现在我的客户机项目,如果他们需要提供一些实现,他们就会实现这个接口。比如说 public class SomeDependencyBuilder : IDependencyBuilder { publ

我正在使用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>();
    }      

}
一切都很好。现在的问题是,我必须在所有客户端项目中添加对Autofac库项目的引用。此外,如果我需要用其他IOC容器替换autofac,我需要更改所有代码。所以这让我感觉很糟糕。 我想要实现的是从客户机项目返回对象列表(实现和接口),并在我的启动函数中注册它们

public interface IDependencyBuilderNew
{
   List<SomeObject> GetList();
}
公共接口IDependencyBuilderNew
{
List 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>();
    }
    }


}
publicstaticvoidbuildmodule(ContainerBuilder-builder)
{
var type=typeof(IDependencyBuilderNew);
var types=AssemblyLocator.GetBinFolderAssemblies().ToList()
.SelectMany(s=>s.GetTypes())
其中(p=>type.IsAssignableFrom(p)&&!p.IsInterface&&!p.isastract);
foreach(类型中的变量类型)
{
var list=((IDependencyBuilderNew)Activator.CreateInstance(type)).GetList();
foreach(列表中的变量l)
{ 
builder.RegisterType().As();
}
}
}
我将如何实现SomeObject,以及在类似情况下的最佳实践是什么

谢谢

帕明德

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

  • 如果非常想摆脱具体的IOC容器,您可以在Agatha请求/响应服务层上看到

  • 使用Autofac模块代替IDependencyBuilder。它更灵活。

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

  • 如果非常想摆脱具体的IOC容器,您可以在Agatha请求/响应服务层上看到

  • 使用Autofac模块代替IDependencyBuilder。它更灵活。

  • 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>();
        }
        }
    
    
    }