1.MVC大项目第一天(框架)

     自动工厂

自动工厂:  作用:帮助我们代替工厂的作用,取出代码的冗余 ,是一种跟好的实现面向接口的一种设计模式  


实现控制反转和依赖注入的工具类
1:Autofac.dll -  只能实现ioc  就是下面这套
2:spring.net :实现ioc 也实现了AOP(切面  例子:过滤器)
3:企业库: Enterprise Libray - 实现了ioc 也实现了AOP 数据库访问 日志记录  安全
4:Unity
5:Castle:IOC

使用自动工厂的步骤: 
1:在ui层中引用 Autofac和Autofac.Integration.Mvc这两个dll 
2:在App_Start中我们可以加入一个类创建一个方法,在Application_Start中调用,表示使用autofac进行依赖输入和控制反转
   2.1:Autofac的使用方法:
            //1:实例化autofac的容器创建者对象
            var bulider = new ContainerBuilder();
  
            //2:实现IDAL 在BLL层中实现  注意需要先在对应的构造函数中注入我们需要实现的接口实例  
                                                                 *我们需要加载的程序集名称 BLL层中的
bulider.RegisterTypes(Assembly.Load("itcast.crm17.Repository").GetTypes()).AsImplementedInterfaces(); 
           
            //实现IBLL  在UI层中实现 
                                                                   *我们需要加载的程序集名称 UI层中的   因为我们需要在这里调用                bulider.RegisterTypes(Assembly.Load("itcast.crm17.Services").GetTypes()).AsImplementedInterfaces(); 
           
            //告诉autofac 将来创建控制器类对象的程序集名称为什么
            Assembly ass = Assembly.Load("itcast.crm17.Site"); //注意到时我们的bll和dal的生成目录需要与其一样
            bulider.RegisterControllers(ass);
 
            //告诉auto发出容器创建者创建一个auto的真正容器对象
            var container = bulider.Build();  到时我们可以将真正的容器加进缓存中  共育 HTTPRunTime.Cache
           
            //告诉mvc将DefaultControllerFactory 替换成autofac中的控制器创建工厂
            //将来所有的接口使用container 去进行传递
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
 

1.依赖注入:就是我们在需要实现接口对象的地方创建构造函数来创建对应的类型的接口对象
例如: 
        IsysKeyValueServices Suser;     
        public HomeController(IsysKeyValueServices user) //注入接口注入到Autofac容器中
        {
            Suser = user;
        }
2.控制反转:就是相当于实现接口的实例对象的时候我们把权利从对应的类交给了自动工厂
 
   优化架构
 1:创建一个EF容器 实现多个方法的调用
 原理:将创建方式设置为一个属性  属性设置为只读  根据条件判断是否需要创建ef
 原因:会导致一个控制器类中如果有对个业务逻辑接口,则会存在多个EF容器对象
       使用线程缓存需要使用的引用: using System.Runtime.Remoting.Messaging; 
     public BaseDBContext db
        {
            get
            {
                string threadCacheKey = typeof(BaseDBContext).FullName;
                //1.0 先问线程缓存是否有ef容器对象实例,如果返回为null则应该创建一个存入到线程缓存中
                object efInstance = CallContext.GetData(threadCacheKey);
                if (efInstance == null)
                {
                    //实例化ef容器对象
                    efInstance = new BaseDBContext();
 
                    //将efInstance存入线程缓存中
                    CallContext.SetData(threadCacheKey, efInstance);
                }
                //返回
                return efInstance as BaseDBContext;
            }
        }
 
 

posted on 2015-05-10 17:42  阿兴的平凡世界  阅读(210)  评论(0)    收藏  举报

导航