.net mvc+IOC+EF结合使用

首先先搭建框架,mvc是UI层,加一个接口层,然后一个实现层,EF做为数据层

.net mvc+IOC+EF结合使用

将所有要实例化的对象交给IOC容器来实例化

先引入NuGet引入unity包

然后写一个类来初始化IOC容器:ObjectFactory.cs

 /// <summary>
    /// 初始化IOC容器
    /// </summary>
    public class ObjectFactory
    {
        private static IUnityContainer _unity = null;
        static ObjectFactory()
        {
            IUnityContainer unity = new UnityContainer();
            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.config");
            Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            UnityConfigurationSection unityConfiguration = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
            unityConfiguration.Configure(unity, "UnityContainer");//这个字符是contatiner名称要与配置文件内一致
            _unity = unity;
        }
        public static IUnityContainer unity
        {
            get { return _unity; }
        }
    }

Unity.config

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Unity.Configuration"/>
  </configSections>
  <unity>
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,Unity.Interception.Configuration" />
    <containers>
      <container name="UnityContainer">      
        <register type="IService.IUserService,IService"    //接口 , 名称空间
         mapTo="Service.UserService,Service"/>  //要映射的对象, 名称空间
        <register type="System.Data.Entity.DbContext,EntityFramework"
         mapTo="Sqlhelper.Model1,Sqlhelper"/>
        <register type="IService.IUserDel,IService"
         mapTo="Service.UserDel,Service"/>
      </container>
    </containers>
  </unity>
</configuration>

还需要一个工厂类: ControllerFactory.cs  继承DefaultControllerFactory

里面重写DefaultControllerFactory的GetControllerInstance方法  用IOC容器来创建实例

 public class ControllerFactory: DefaultControllerFactory
    {
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
              return (IController)ObjectFactory.unity.Resolve(controllerType);
            //return base.GetControllerInstance(requestContext, controllerType);
        }
    }

然后在全局配置中指定为我们自己的工厂,不然mvc还是使用的默认的

在Application_Start()下添加

ControllerBuilder.Current.SetControllerFactory(new ControllerFactory());  指定我们的工厂类

这样mvc在访问时就会用我们的IOC来自动实例化对象。

 

那如何使用呢?

现在IService中定义一个方法,在Service中实现这个接口

 public interface IUserService:IDisposable
    {
        IQueryable<tb_UserInfo> Query(Expression<Func<tb_UserInfo, bool>> where);   
    }
=====================================
  public class UserService: IUserService
    {
        private DbContext _Db = null;
        public UserService(DbContext db)
        {
            this._Db = db;

        }

        public void Dispose()
        {
            if (_Db!=null)
            {
                _Db.Dispose();
            }
        }

        public IQueryable<tb_UserInfo> Query(Expression<Func<tb_UserInfo,bool>> where)
        {
            //using (Model1 db = new Model1())//原来的使用方式,需要new一个操作类  现在用IOC直接把我们需要的类用构造函数注入来拿到类型,直接使用    ps:需要在配置文件里配好映射关系
//{
            //    return db.tb_UserInfo.Where(where);
            //}
            
            return _Db.Set<tb_UserInfo>().Where(where);
        }
    }

我们在HomeController下创建个Action   Index2

我们准备在Action中用我们刚刚搭建的环境中的Service里的UserService中的Query方法

原始方法:

IService a=new Service();

 var b = a.Query();

现在有IOC后能自动实例化对象,我们可用构造函数直接获取我们需要的对象

 private IUserService _Iuser = null;
        private IUserDel _userDel = null;

        public HomeController(IUserService user, IUserDel userDel)
        {
            this._Iuser = user;
            this._userDel = userDel;
        }

直接var b = _Iuser.Query();就可以了

只需要在配置文件里配置好映射关系就行。

如:IUserService 映射为 UserService

需要几个对象就在构造函数里加,然后添加好配置文件就好。

 

.net mvc+IOC+EF结合使用

上一篇:JavaScript判断浏览器UA


下一篇:shared_ptr和多线程