首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP.Net MVC中实现Unity的正确方法是什么?

在ASP.Net MVC中实现Unity的正确方法是什么?
EN

Stack Overflow用户
提问于 2011-02-22 15:00:02
回答 2查看 535关注 0票数 0

好的,当你搜索这个主题时,在谷歌里会有很多结果:NerdDinnerCodeClimberCodeProject等等。但它们似乎都没有像预期的那样工作!它们要么在构建过程中出错,要么在运行时出错!在ASP.Net MVC2中实现Unity2.0的正确方法是什么?我就是不能让它工作!

非常感谢您的帮助和想法。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-22 15:18:28

尝试使用Unity编写一个简单的控制器工厂,它能够解析控制器实例:

代码语言:javascript
复制
public class UnityControllerFactory : DefaultControllerFactory 
{
    private readonly IUnityContainer _container; 
    public UnityControllerFactory(IUnityContainer container) 
    { 
        _container = container; 
    }

    protected override IController GetControllerInstance(
        RequestContext requestContext, 
        Type controllerType
    ) 
    { 
        if (controllerType == null)
        {
            throw new ArgumentNullException("controllerType");
        }
        if (!typeof(IController).IsAssignableFrom(controllerType))
        {
            throw new ArgumentException("Type requested is not a controller", "controllerType");
        }
        return _container.Resolve(controllerType) as IController; 
    }
}

然后将其挂接到Global.asax中的Application_Start事件中

代码语言:javascript
复制
protected void Application_Start()
{
    ...
    var container = new UnityContainer();
    // TODO: Configure the container here with your controllers

    var factory = new UnityControllerFactory(container);
    ControllerBuilder.Current.SetControllerFactory(factory);
}
票数 3
EN

Stack Overflow用户

发布于 2011-02-22 15:39:44

这是我的UnityControllerFactory版本。它使用反射从调用程序集获取控制器,并在容器中注册它们。

代码语言:javascript
复制
using System;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Web.Mvc;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;

namespace WebProveidorsMVC.DI.ControllerFactories
{
    public class UnityControllerFactory : DefaultControllerFactory
    {
        private readonly IUnityContainer _container;

        public UnityControllerFactory()
        {
            _container=new UnityContainer();

            ((UnityConfigurationSection) ConfigurationManager.GetSection("unity")).Configure(_container);

            var controllerTypes = from t in Assembly.GetCallingAssembly().GetTypes()
                                  where typeof(IController).IsAssignableFrom(t)
                                  select t;

            foreach (var t in controllerTypes)
                _container.RegisterType(t, t.FullName);
        }

        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            if (controllerType != null)
                return (IController)_container.Resolve(controllerType);
            return null;
        }

        public override void ReleaseController(IController controller)
        {
            _container.Teardown(controller);
            base.ReleaseController(controller);
        }
    }
}

然后在我的ApplicationStart方法中,我像这样注册它:

代码语言:javascript
复制
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5075056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档