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。