您好,并提前感谢您的帮助。
我对如何在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做一个“共同的”统一集合。
答案 0 :(得分:1)
您将始终需要容器设置,但您可以创建一个ControllerFactory并将其注册到MVC,而不是直接使用DependencyResolver。有关Unity的示例,请参阅here。
这允许您在Controller中保留其所有依赖关系和分辨率,并且传递给表示层的任何内容都应该是平面模型或简单的视图数据。