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,如下图所示:
NeGet管理
为指定项目安装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.asaxApplication_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的依赖注入设置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值