首先先搭建框架,mvc是UI层,加一个接口层,然后一个实现层,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
需要几个对象就在构造函数里加,然后添加好配置文件就好。