我正在使用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
Thanks Memoizer – Parminder 2013-03-07 03:37:38