.net mvc+IOC+EF结合使用
2021-08-05 00:56
标签:框架 ide rgba 函数 nmap queryable section rac png 首先先搭建框架,mvc是UI层,加一个接口层,然后一个实现层,EF做为数据层 将所有要实例化的对象交给IOC容器来实例化 先引入NuGet引入unity包 然后写一个类来初始化IOC容器:ObjectFactory.cs /// /// 初始化IOC容器 /// 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 //要映射的对象, 名称空间 还需要一个工厂类: 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 Query(Expression 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 Query(Expression where) { //using (Model1 db = new Model1())//原来的使用方式,需要new一个操作类 现在用IOC直接把我们需要的类用构造函数注入来拿到类型,直接使用 ps:需要在配置文件里配好映射关系 //{ // return db.tb_UserInfo.Where(where); //} return _Db.Set().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结合使用标签:框架 ide rgba 函数 nmap queryable section rac png 原文地址:https://www.cnblogs.com/zjhn/p/14894792.html