MVC5 采用Unity依赖注入
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入(Constructor Injection)、属性注入(Property Injection),以及方法调用注入(Method Call Injection)。
1. 定义Model
//系统用户类
public class SysUserModel
{
public string UserID { get; set; }
public string UserName { get; set; }
public string TrueName { get; set; }
public string Password { get; set; }
public bool Status { get; set; }
}
2. 定义SysUser数据访问的接口
//SysUser数据访问的接口
public interface ISysUserRepository
{
/// <summary>
/// 检查登陆
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <returns></returns>
ResultModel CheckLogin(string userName, string password);
/// <summary>
/// 查询用户
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="status">状态</param>
/// <returns></returns>
List<SysUserModel> Get(string userName, string status);
}
3. 定义实现接口的实体类
public class SysUserRepository: ISysUserRepository
{
/// <summary>
/// 登录判断
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <returns>操作返回</returns>
public ResultModel CheckLogin(string userName, string password)
{
ResultModel ResultModel = new ResultModel();
try
{
using (SqlConnection conn = BaseDAL.CreateSqlConnection())
{
conn.Open();
string sqlCommand = "Select * From SysUser Where UserName = @UserName";
DynamicParameters parameters = new DynamicParameters();
parameters.Add("UserName", userName, DbType.String);
SysUserModel userModel = conn.Query<SysUserModel>(sqlCommand, parameters).SingleOrDefault();
if (userModel == null)
ResultModel.Message = "用户名不存在!";
else
{
if (userModel.Password == SystemHelper.GetMD5(password))
{
if (userModel.Status)
{
ResultModel.Success = true;
ResultModel.Data = userModel;
}
else
ResultModel.Message = "该用户已被禁用!";
}
else
ResultModel.Message = "用户名或密码错误!";
}
conn.Close();
}
}
catch (Exception ex)
{
ResultModel.Message = "Error:" + ex.Message;
}
return ResultModel;
}
/// <summary>
/// 查询用户信息
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="status">是否启用</param>
/// <returns>操作返回</returns>
public ResultModel Get(string userName, string status)
{
ResultModel ResultModel = new ResultModel();
try
{
using (SqlConnection conn = BaseDAL.CreateSqlConnection())
{
conn.Open();
string sqlCommand = "Select * From SysUser Where 1=1";
DynamicParameters parameters = new DynamicParameters();
if (!string.IsNullOrEmpty(userName))
{
sqlCommand += " and UserName like @UserName";
parameters.Add("UserName", "%" + userName + "%", DbType.String);
}
if (!string.IsNullOrEmpty(status))
{
sqlCommand += " and Status = @Status";
if (status == "启用")
parameters.Add("Status", true, DbType.Boolean);
else
parameters.Add("Status", false, DbType.Boolean);
}
ResultModel.Data = conn.Query<SysUserModel>(sqlCommand, parameters).ToList();
ResultModel.Success = true;
conn.Close();
}
}
catch (Exception ex)
{
ResultModel.Message = "Error:" + ex.Message;
}
return ResultModel;
}
}
4. 创建Core项目
创建Core项目,专门用于依赖注册。
//注入类
public class UnityConfigure
{
public static UnityDependencyResolver RegisterContainer()
{
var container = new UnityContainer();
container.RegisterType<ISysUserRepository, SysUserRepository>();
return new UnityDependencyResolver(container);
}
}
public class UnityDependencyResolver : IDependencyResolver
{
private const string HttpContextKey = "perRequestContainer";
private readonly IUnityContainer _container;
public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
if (typeof(IController).IsAssignableFrom(serviceType))
{
return ChildContainer.Resolve(serviceType);
}
return IsRegistered(serviceType) ? ChildContainer.Resolve(serviceType) : null;
}
public IEnumerable<object> GetServices(Type serviceType)
{
if (IsRegistered(serviceType))
{
yield return ChildContainer.Resolve(serviceType);
}
foreach (var service in ChildContainer.ResolveAll(serviceType))
{
yield return service;
}
}
protected IUnityContainer ChildContainer
{
get
{
var childContainer = HttpContext.Current.Items[HttpContextKey] as IUnityContainer;
if (childContainer == null)
{
HttpContext.Current.Items[HttpContextKey] = childContainer = _container.CreateChildContainer();
}
return childContainer;
}
}
public static void DisposeOfChildContainer()
{
var childContainer = HttpContext.Current.Items[HttpContextKey] as IUnityContainer;
if (childContainer != null)
{
childContainer.Dispose();
}
}
private bool IsRegistered(Type typeToCheck)
{
var isRegistered = true;
if (typeToCheck.IsInterface || typeToCheck.IsAbstract)
{
isRegistered = ChildContainer.IsRegistered(typeToCheck);
if (!isRegistered && typeToCheck.IsGenericType)
{
var openGenericType = typeToCheck.GetGenericTypeDefinition();
isRegistered = ChildContainer.IsRegistered(openGenericType);
}
}
return isRegistered;
}
}
5. NuGet安装
在Vusual Studio的工具栏中选择NuGet包管理安装Unity,如下图所示:
6. 构建Controller
在Controller中使用构造函数的形式引入Repository。
public class SysUserController : Controller
{
private ISysUserRepository _repository;
public SysUserController(ISysUserRepository repository)
{
this._repository = repository;
}
// GET: SysUser
public ActionResult Index()
{
return View();
}
}
7. 依赖注册生效
引用Core项目后,在Global.asax的Application_Start方法中注册依赖。
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
DependencyResolver.SetResolver(UnityConfigure.RegisterContainer());
}
}
由此,完成Unity的依赖注入设置。