如果有很多實現接口需要用到autofac進行注入,是不是需要調用ContainerBuilder.RegisterType()這個方法很多次?那有沒有一個偷懶的方法呢?只需要三四行代碼就可以實現所有接口的注入呢?有的
第一步:創建如下這樣一個空接口
public interface IDenpendency
{
}
接口名稱可以隨便取
第二步:創建需要注入到autofac容器裏的功能接口,這類接口就是你想實現某些功能的封裝,它們都有一個共同的特點:繼承第一步創建的接口IDenpendency,如下,我創建一個功能接口
public interface IFunction1:IDenpendency
{
string GetName();
}
這個接口你可以添加任何你想要實現的方法聲明
第三步:有了接口,我們就需要實現這些接口了,如下,我創建了一個實現IFunction1的類
public class Funciton1 : IFunction1
{
public string GetName()
{
return "功能點1";
}
}
好了,到了這裏,我們已經把基本用到的零件都構建好了,現在只剩下把這些零件給組裝到autofac容器裏面了
第四步:將接口注入到容器裏面
public static ContainerBuilder Register()
{
var builder = new ContainerBuilder();
Type basetype = typeof(IDenpendecy);
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => basetype.IsAssignableFrom(t) && t.IsClass)
.AsImplementedInterfaces().InstancePerLifetimeScope();
return builder;
}
上面的代碼裏面有一個關鍵點:Type basetype = typeof(IDenpendecy);
第五步:測試
static void Main(string[] args)
{
var builder= AutofacRegister.Register();
using (var container = builder.Build())
{
IFunction1 function1 = container.Resolve<IFunction1>();
Console.WriteLine(function1.GetName());
}
Console.Read();
}
結果截圖:
這裏要講一下第一步我爲什麼要創建一個IDenpendecy這樣的一個空接口,我們在第四步可以看到,我們是在我們當前程序運行的程序集裏面找到所有繼承於IDenpendecy這個接口的類的,把這些實現類注入到autofac容器裏面的。這裏就要講一下這樣做到的思路:只要是想把接口注入到autofac容器中,那麼這個接口就要繼承IDenpendecy這個接口,我們在第四步就是根據有沒有繼承IDenpendecy這個接口條件來篩選需要注入到容器的接口。所以這裏我們還可以用另外一種實現方式來實現:創建自定義屬性,然後把需要實現注入的接口都加上這個屬性即可。
總結:實際上上面實現的方式,歸納一點就是通過反射來找到所有自定義的接口然後將這些接口注入到容器中,實現一次性注入所有接口的目的,上面第四步我是取的當前運行的程序所在的程序集,實際上我們可以通過配置文件實現可配置化,這樣我們想要用哪個dll來實現業務功能,直接修改配置文件就可以,這樣更靈活
以上是我的一個很淺顯簡單的應用總結,方便以後用到的時候可以直接拷貝代碼,不用再去網上漫天查找資料,具體的實現原理,可以看一下autofac源碼,這裏給出兩個參考的博客連接:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/
https://www.cnblogs.com/ingstyle/p/6655883.html