2009-06-17 132 views
9

我的問題如下: 我有一個名爲ApplicationController的基礎控制器(ASP.Net MVC控制器),我希望我的所有控制器都從它繼承。這個基礎控制器有一個ILogger屬性,標有[Dependency]屬性。 (是的,我知道我應該使用構造函數注入,我只是好奇這個屬性)。統一[依賴]注入和繼承

我創建了容器,註冊類型,更改了默認工廠,一切都很好。問題是當我嘗試在派生控制器中使用我的Logger屬性時,它沒有解決。

我做錯了什麼?爲什麼容器在創建派生控制器時不解析基類相關性?

代碼樣品:


的ApplicationController:

public class ApplicationController : Controller 
{ 
    [Dependency] 
    protected ILogger _logger { get; set; } 

} 

衍生控制器:

public class HomeController : ApplicationController 
{ 
    public HomeController() 
    { 

    } 
    public ActionResult Index() 
    { 
     _logger.Log("Home controller constructor started."); 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

統一控制器工廠:

public class UnityControllerFactory : DefaultControllerFactory 
{ 
    private readonly IUnityContainer _container; 
    public UnityControllerFactory(IUnityContainer container) 
    { 
     _container = container; 
    } 

    protected override IController GetControllerInstance(Type controllerType) 
    { 
     return _container.Resolve(controllerType) as IController; 
    } 
} 

的Global.asax.cs樣本:


我是很新的團結,所以也許我做錯了什麼。

謝謝, Ami。

+0

這是否適用於應用程序控制器? – 2009-06-17 14:30:20

+0

你有沒有得到這個工作?我的代碼幾乎是相同的,我無法讓基礎控制器來解決。任何人? – 2009-09-03 21:05:17

+0

Ray - 在將這些屬性公開之後,它就工作了。這是你爲了讓Unity工作而必須付出的代價。 – Ami 2009-09-04 07:26:01

回答

18

AFAIK,Unity只會解決公共財產問題。因此,您的受保護的財產將不會被解決。

0

我不確定這是否相關,但通常我避免使用名稱空間和具有相同名稱的類(在您的情況下,Logger.Logger),因爲過去我遇到過這個問題。但這可能不是問題。

我也不確定[Dependency]屬性是否適用於派生類型。如果你改變它的構造函數注入,這是否仍然無效?喜歡的東西:

public class ApplicationController : Controller 
{ 
    protected ILogger _logger { get; set; } 


    public ApplicationController(ILogger logger) 
    { 
     this._logger = logger; 

    } 
} 

public class HomeController : ApplicationController 
{ 
    public HomeController(ILogger logger) : base(logger) 
    { 

    } 
    public ActionResult Index() 
    { 
     _logger.Log("Home controller constructor started."); 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

,其餘完全一樣。代碼看起來不錯。

0

我對團結還沒有經驗,但我認爲你需要註冊你的HomeController與contsaner,而不是記錄器。

0

我有同樣的問題,並通過將ILogger更改爲public來修復它。這與VS2010,.NET 4中的ASP.NET MVC2項目有關。從邏輯上講,它是有道理的,因爲Unity沒有創建代理類或任何類,它只是設置它有權訪問的屬性,並且具有映射 - 因此僅限公衆。