2013-03-05 56 views
1

我正在使用autofac作爲IOC容器的asp.net mvc項目。我有一個接口IDependencyBuilder,如下所示。如何避免所有項目中的autofac引用

public interface IDependencyBuilder 
{ 
    void Build(ContainerBuilder builder); 
} 

現在我的客戶端項目,如果他們需要提供一些實現,他們實現這個接口。例如。

public class SomeDependencyBuilder : IDependencyBuilder 
{ 
    public void Build(ContainerBuilder builder) 
    { 
     builder.RegisterType<FeedService>().As<IFeedService>(); 
    }  

} 

現在,在我的啓動程序。我得到了IDependencyBuilder的所有實例並調用它們的構建方法

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 Library項目的引用。另外,如果我需要用一些其他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,什麼是類似情況下的最佳實踐。

感謝

成員Parminder

回答

相關問題