好的,当你搜索这个主题时,在谷歌里会有很多结果:NerdDinner,CodeClimber,CodeProject等等。但它们似乎都没有像预期的那样工作!它们要么在构建过程中出错,要么在运行时出错!在ASP.Net MVC2中实现Unity2.0的正确方法是什么?我就是不能让它工作!
非常感谢您的帮助和想法。谢谢!
发布于 2011-02-22 15:18:28
尝试使用Unity编写一个简单的控制器工厂,它能够解析控制器实例:
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事件中
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);
}发布于 2011-02-22 15:39:44
这是我的UnityControllerFactory版本。它使用反射从调用程序集获取控制器,并在容器中注册它们。
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方法中,我像这样注册它:
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());https://stackoverflow.com/questions/5075056
复制相似问题