依赖注入(控制反转)
常见的依赖注入工具:AutoFac,Spring.Net,Unity等
依赖注入的方式:1.通过构造函数进行注入2.通过属性进行注入
注意:在项目中AutoFac的注入有两次,第一次是将数据访问层的类注入到业务逻辑层。第二次是将业务逻辑层的类注入到UI层。
AutoFac在MVC的使用
我在APP_Start文件夹中新建了一个类命名为AutoFacConfig
定义一个静态的无返回的方法
public static void Register()
{
//1.0 创建一个autofac的容器对象
var bulider = new ContainerBuilder();
//1.0.1 获取程序集载入到Assembly对象中
Assembly controllerDll = Assembly.Load("Study.CRM.Site");
//1.0.1 告诉autofac对象将来实例化的控制器所存在的程序集是Study.CRM.Site.dll
bulider.RegisterControllers(controllerDll);
#region 2.0 仓储的注册
//2.0 利用bulider对象开始创建仓储的实现类与对应的仓储接口的对应关系
//注意:如果加了InstancePerHttpRequest() 每次都是的新的实体进行注入操作
//注册单个仓储来到其对应的接口
//bulider.RegisterType(typeof(sysFunctionRepository)).As(typeof(IsysFunctionRepository)).InstancePerHttpRequest();
//注册程序中所有的类到其实现接口
Assembly repositoryAss = Assembly.Load("Study.CRM.Repository");
bulider.RegisterTypes(repositoryAss.GetTypes()).AsImplementedInterfaces();
#endregion
#region 3.0 业务逻辑层的注册
//3.0 利用bulider对象开始创建业务逻辑实现类与对应的业务逻辑接口的对象关系
//单个注册业务逻辑类到其对应的接口
//bulider.RegisterType(typeof(sysFunctionServices)).As(typeof(IsysFunctionServices)).InstancePerHttpRequest();
//注册业务逻辑程序中的所有类到其实现的接口(AsImplementedInterfaces() 此方法:就是用来自动转成接口的)
Assembly servicesAss = Assembly.Load("Study.CRM.Services");
bulider.RegisterTypes(servicesAss.GetTypes()).AsImplementedInterfaces();
//注册当前程序中类型名称的前缀为sysFunction 的所对应类的实例
//bulider.RegisterTypes(servicesAss.GetTypes().Where(c => c.Name.StartsWith("sysFunction")).ToArray()).AsImplementedInterfaces();
#endregion
//4.0 告诉MVC框架将来所有控制器的对象的创建工作交给autofac.dll中的控制器工厂来完成
//特点:会利用控制器中的有参数构造函数创建其对象,同时在创建的过程中,会根据构造函数中的
//接口参数,将此接口的具体实现类的对象注入
//4.0.1 根据已经注册好的组建创建此容器对象中所有的映射关系的具体实现
var container = bulider.Build();
// 4.0.2 将MVC的控制器对象实例 交由autofac来创建
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
在global文件中进行注册
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//注册区域路由规则
AreaRegistration.RegisterAllAreas();
//注册全局过滤器
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
//注册网站路由
RouteConfig.RegisterRoutes(RouteTable.Routes);
//优化js,css文件
BundleConfig.RegisterBundles(BundleTable.Bundles);
//利用AutoFac实现项目的IOC和DI
AutoFacConfig.Register();
}
}