0

你好,并提前感谢任何帮助。ASP.NET MVC3和Unity - 从表示层分离Unity实现?

我有一个关于如何在我的MVC3应用程序中构建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); 
} 
} 

而一个统一的容器设置类,具有从Global.asax中称为设置:

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

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

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

但是,如果我想重新使用常用程序集来从别的方面使用Unity,比如使用同一个存储库和DAL的Web Form应用程序,那么这似乎并没有多大意义。

或者,这只是你需要做的工作让Unity工作?即如果我在各个项目中更改Unity实现,我只需要依次访问每个项目?或者,我的方法可以让中间人妥协吗?

这里我明显的问题是,IDependencyResolver是MVC的一部分。所以我不确定如何为MVC做一个“共同的”统一的程序集。

回答

1

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

这使您可以将所有依赖关系和解决方案保留在Controller中,并且您传递给表示层的任何内容都应该是平面模型或简单的viewdata。