2010-05-08 114 views
3

我有以下項目佈局:什麼是從Controller實例化IRepository類的正確方法?

MVC UI 
|...CustomerController (ICustomerRepository - how do I instantiate this?) 

Data Model 
|...ICustomerRepository 

DAL (Separate Data access layer, references Data Model to get the IxRepositories) 
|...CustomerRepository (inherits ICustomerRepository) 

什麼說ICustomerRepository repository = new CustomerRepository();當控制器沒有知名度的DAL項目的正確方法是什麼?還是我這樣做完全錯了?

回答

2

通過註冊允許容器解析控制器的控制器工廠,您可以使用IoC容器爲您解析映射 - 容器將解析控制器類型並注入接口的具體實例。

例在MvcApplication類使用Castle Windsor

在Global.asax中

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory()); 
} 

WindsorControllerFactory

using System; 
using System.Linq; 
using System.Reflection; 
using System.Web.Mvc; 
using System.Web.Routing; 
using Castle.Core.Resource; 
using Castle.Windsor; 
using Castle.Windsor.Configuration.Interpreters; 

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    WindsorContainer container; 

    public WindsorControllerFactory() 
    { 
     container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle"))); 

     var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
           where typeof(IController).IsAssignableFrom(t) 
           select t; 

     foreach (Type t in controllerTypes) 
      container.AddComponentWithLifestyle(t.FullName, t, Castle.Core.LifestyleType.Transient); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     // see http://stackoverflow.com/questions/1357485/asp-net-mvc2-preview-1-are-there-any-breaking-changes/1601706#1601706 
     if (controllerType == null) { return null; } 

     return (IController)container.Resolve(controllerType); 
    } 
} 
+0

羞於承認我從來沒有聽說過的IoC容器。我從來沒有碰過依賴注入。你能給我一個解釋和例子,說明它的使用方法嗎? – GenericTypeTea 2010-05-08 20:48:39

+0

控制反轉(IoC)通過管理類型之間的依賴來幫助構建鬆散耦合的系統 - 很多時候對象可以依賴於其他對象,例如,控制器依賴於存儲庫來填充模型。這些依賴關係可以使用IoC容器進行管理,以便當某個類型需要另一個類型的實例時,它會向容器請求它,並且該容器將返回它被配置爲返回的類型的實例... – 2010-05-08 21:08:38

+0

例如,您的控制器想要一個'ICustomerRepository'的具體實例,所以它要求它的容器。儘管我們可以進一步推進,但我們也可以讓容器管理控制器的實例化。我們在這裏獲得的好處以及使用IoC容器的衆多原因之一是,在實例化控制器時,容器會意識到它具有對「ICustomerRepository」的依賴並實例化它(也稱爲依賴注入) 。 – 2010-05-08 21:12:47

相關問題