ASP.NET MVC3和Unity - 从表示层解耦Unity实现?

时间:2012-07-16 23:23:25

标签: c# asp.net-mvc asp.net-mvc-3 dependency-injection unity-container

您好,并提前感谢您的帮助。

我对如何在MVC3应用程序中构建Unity有疑问。

目前我已经从这个有用的示例代码建模我的Unity实现:

http://kevww.wordpress.com/2012/01/04/dependency-injection-with-unity-2-0-in-mvc-3/

我可以让它工作正常,但我问自己是否有一个稍微不同的方法。从本质上讲,解决方案需要两个类,第一个是依赖解析器。

public class UnityDependencyResolver : IDependencyResolver
{
IUnityContainer _container;

public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
}

public object GetService(Type serviceType)
{
object instance;
try
{
instance = _container.Resolve(serviceType);
if (serviceType.IsAbstract || serviceType.IsInterface)
{
return null;
}
return instance;
}
catch (Exception e)
{
return null;
}
}

public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType);
}
}

Unity容器安装程序类,其中包含从Global.asax调用的设置:

public class UnityContainerSetup
{
public static void SetUp()
{
var container = new UnityContainer();
container.RegisterType<ISomeService, SomeService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}

好的,我的问题。有没有更好的方法来实际解耦这个Unity实现?

我创建了一个单独的项目,并将上面的两个类放在其中。我在新项目中引用System.Web.Mvc以解析IDependencyResolver后,工作正常。

但是,如果我想重新使用通用程序集从其他东西使用Unity,例如使用相同存储库和DAL的Web窗体应用程序,那么这似乎没有多大意义。

或者,这只是你需要做的管道才能让Unity工作吗?即如果我在各种项目中改变我的Unity实现,我将不得不轮流访问每一个项目?或者我的做法是否适合中间地带妥协?

这里显而易见的问题是IDependencyResolver是MVC的一部分。所以我不确定如何为MVC做一个“共同的”统一集合。

1 个答案:

答案 0 :(得分:1)

您将始终需要容器设置,但您可以创建一个ControllerFactory并将其注册到MVC,而不是直接使用DependencyResolver。有关Unity的示例,请参阅here

这允许您在Controller中保留其所有依赖关系和分辨率,并且传递给表示层的任何内容都应该是平面模型或简单的视图数据。