之前使用以來注入的時候,都是在xml配置對應的接口和實現類,經常會出現忘了寫配置,導致注入不生效,會報錯,而且項目中使用的是SPA的模式,ajax報錯也不容易看出問題,經常會去排查日志找問題。
於是在園子里面看到園友的自動注入,覺得很有意思,但是園友是用的MVC5,就自己再.Net Core上試了一下,於是就記錄下來使用的過程
在asp.net core中,自帶了一個依賴注入容器,但是功能有限,我們一般會采用第三方的容器來接管自帶的容器,
var builder = new ContainerBuilder(); builder.Populate(services); var baseType = typeof(AutoInject); var assembly = Assembly.GetEntryAssembly(); builder.RegisterAssemblyTypes(assembly) .Where(t => baseType.IsAssignableFrom(t) && t != baseType) .AsImplementedInterfaces().InstancePerLifetimeScope(); this.ApplicationContainer = builder.Build();
AutoInject 是一個空的接口,只會為了標記一下哪些地方需要被autofac自動注入
然后來試一下,添加一個接口Itest.cs,實現AutoInject
public interface ITest: AutoInject { string GetName(); }
添加一個實現類Test.cs
public class Test:ITest { public string GetName() { return "getName"; } }
在控制器的構造方法里面把需要注入的接口添加進去
private readonly ITest test; public HomeController(ITest test) { this.test = test; }
運行
但是實際上,很多項目都會把項目分到其他的類庫里面,如果使用Assembly.GetEntryAssembly();,放到其他的項目里面的可以被注入的類就無法被注入了,所以需要手動去加載其他的程序集,當然也可以用代碼去掃描一下
AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName("程序集名稱"));
autofac的RegisterAssemblyTypes方法參數是一個數組,把需要注入的程序集加載起來,拼成一個數組,傳遞進去就可以實現在.Net Core下的跨程序集加載了