1、介紹
所謂程序集級別的依賴注入是指接口和實現的依賴不使用配置文件或硬代碼實現
(
builder.RegisterType<UserInfoService>().As<IUserInfoService>();),而是通過名稱約定實現依賴注入
2、項目接口及dll
2.1 項目結構(創建MVC3項目)
2.2 UI層需引入的dll(使用nuget引入)
2.2.1
Autofac
2.2.2
Autofac.Integration.Mvc
2.2.3 MyMVC3.Business.IServices
2.2.4 MyMVC3.Modules.IRepository
2.2.5 MyMVC3.Modules.Model
3、依賴注入配置代碼(在Global.asax的Application_Start方法中調用)
/// <summary>
/// 使用AutoFac實現依賴注入
/// </summary>
private void autoFac()
{
var builder = new ContainerBuilder();
SetupResolveRules(builder); //注入
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //注入所有Controller
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
private void SetupResolveRules(ContainerBuilder builder)
{
//UI項目只用引用service和repository的接口,不用引用實現的dll。
//如需加載實現的程序集,將dll拷貝到bin目錄下即可,不用引用dll
var IServices = Assembly.Load("MyMVC3.Business.IServices");
var Services = Assembly.Load("MyMVC3.Business.Services");
var IRepository = Assembly.Load("MyMVC3.Modules.IRepository");
var Repository = Assembly.Load("MyMVC3.Modules.Repository");
//根據名稱約定(服務層的接口和實現均以Service結尾),實現服務接口和服務實現的依賴
builder.RegisterAssemblyTypes(IServices, Services)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces();
//根據名稱約定(數據訪問層的接口和實現均以Repository結尾),實現數據訪問接口和數據訪問實現的依賴
builder.RegisterAssemblyTypes(IRepository, Repository)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
}
4、各層級間配置構造函數注入
4.1
UserInfoService
private IUserInfoRepository productRepository; public UserInfoService(IUserInfoRepository productRepository) { this.productRepository = productRepository; this.AddDisposableObject(productRepository); }
4.2
UserInfoService
public IUserInfoService userService;
public HomeController(IUserInfoService userService)
{
this.userService = userService;
this.AddDisposableObject(userService);
}
