微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

搞定.NET MVC IOC控制反转,依赖注入

一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记!

1、首先创建MVC项目

2、然后新建一个接口IServiceA

public interface IServiceA
    {
        string Name();
    }

实现接口

public class ServiceA : IServiceA
    {
        public string Name()
        {
            return "Service A";
        }
    }

简单点说,就是要把IService的调用自动注入ServiceA类型

新建MVC控制器:HomeController并添加构造函数

    public class HomeController : Controller
    {
        protected Service.IServiceA ServiceA;
        public HomeController(Service.IServiceA a)
        {
            this.ServiceA = a;
        }
    }

下面我们来实现如何通过IOC把IServiceA注入为ServiceA类型

Nuget添加引用,搜索Unity,如果提示失败的话,就用Nuget的命令添加以前的版本,不知道怎么敲就直接添加PolicyInJection引用好了

新建类:UnityDependencyReslover

public class UnityDependencyReslover : System.Web.Mvc.IDependencyResolver
{
IUnityContainercontainer;
public UnityDependencyReslover(IUnityContainercontainer)
{
this.container = container;
}

public object GetService(Type t)
{
if (t == null) return null;
if (!container.IsRegistered(t)) return null;
return container.Resolve(t);
}

public IEnumerableobject GetServices(Type t)
{
return container.ResolveAll(t);
}
}

这个没有啥好说的把,就是实现类型映射的解析而已

Global.asax的Application_Start中注册解析类型映射

IUnityContainer container = new UnityContainer();
container.RegisterTypeService.IServiceA,Service.ServiceA();
container.RegisterTypeIControllerFactory,IOC.MyControllerFactory();
DependencyResolver.SetResolver(new IOC.UnityDependencyReslover(container));

看标红的那句,这里简单说明一下,HomeController的构造函数带了参数,认情况下MVC的控制器初始化没有参数的,这里我们要自己去实现对参数的解析,也就是在这个地方注入参数,不然你的MVC控制器无法访问

新建:MyControllerFactory继承System.Web.Mvc.DefaultControllerFactory
public class MyControllerFactory : DefaultControllerFactory
{
IUnityContainercontainer;
public MyControllerFactory(IUnityContainercontainer)
{
this.container = container;
}

protected override IControllerGetControllerInstance(RequestContext requestContext,Type controllerType)

{
if (controllerType == null) return null;
return container.Resolve(controllerType) as IController;
}
}

这样就行啦!

在你的MVC的HomeController里面添加一个Action访问下IServiceA的Name方法试试,是不是可以了!

这里我要说明一下,有几个地方要注意:那个IUnityContainer要统一,先前我尝试过一直不成功,后来发现是有的地方用的是UnityContainer,所以还是要认真一点!

添加代码代码无法高亮加粗,所以没用代码形式添加

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐