簡體   English   中英

使用CastleWindsor解決依賴關系

[英]Resolving dependencies using CastleWindsor

我是Castle Windsor的新手。 當涉及到依賴解析時,它在.NET MVC應用程序中運行得非常好。 目前,我通過使用Construtor注入(Eg1)或屬性注入(2)來解析CONTROLLERS中的依賴關系。 問題是當我嘗試使用屬性注入解析另一個類(非控制器類)中的依賴項時,這不會自動解析(例如3)

例如1 - 解決確定!

public class HomeController : Controller
{
    private IUserRepo _userRepo;

    public HomeController(IUserRepo userRepo)
    {
       _userRepo = userRepo;
    }

    public ActionResult Show()
    {
        return View(userRepo.GetAllUsers());
    }

}

例如2 - 解決好!

public class HomeController : Controller
{
    public IUserRepo _userRepo {get;set;}

    public HomeController()
    {
    }

    public ActionResult Show()
    {
       return View(_userRepo.GetAllUsers());
    }
}

例如3 - 不解決!

public class ValidationRepository
{
   public IUserRepo _userRepo {get;set;}

   public bool ValidateUser()
   {
        //Here _userRepo is never resolved.
        // NB: I want property injection instead of constructor injection, is there any way?
   }
}

謝謝

您沒有顯示足夠的代碼來明確說明為什么您的依賴關系沒有得到解決。 您沒有展示如何實例化類,這對於了解如何/是否解析依賴關系非常重要。

也就是說,我可以在這里做出有根據的猜測:

您的控制器正在使用控制器工廠,該工廠通過容器(Windsor)解析每個控制器。 您的ValidationRepository是以不以容器管理的其他方式創建的(例如, new ValidationRepository() )。 為了使依賴項解析起作用,ValidationRepository需要屬於與控制器相同的依賴關系鏈 - 換句話說,它必須是其中一個控制器的依賴關系(或依賴關系的依賴關系,因此它的一部分)依賴鏈)。

如果您確實手動實例化ValidationRepository(使用new ),則控制器不知道該類,因此無法解析其依賴關系。 嘗試使ValidationRepository成為您的一個控制器上的構造函數依賴項,看看它是否有效。

您需要確保在Windsor Container中注冊IUserRepo和ValidationRepository的實例化,然后Container中的其他項(例如您的控制器)可以依賴它們,並且它們可以相互依賴。 例如,像:

container.Register(
            Component.For<IUserRepo>()
            .LifeStyle.Transient.
            .ImplementedBy<YourRealUserRepo>());

container.Register(
            Component.For<ValidationRepository>()
                .LifestyleTransient());

鑒於你所寫的內容,看起來你已經完成了第一步,因為你的控制器很樂意接受IUserRepo的實例化。

一旦ValidationRepository也在那里,你可以使用屬性注入或構造函數注入,它將只是工作。

但請注意,只有從Castle Windsor容器中獲取ValidationRepository實例時,這一切才有效。 執行'new ValidationRepository()'會在容器外實例化它,Castle Windsor不會知道注入依賴項。 理想情況下,ValidationRepository將是容器中另一個對象的依賴項,作為依賴對象的Property或Constructor Parameter。 然后Castle Windsor將根據需要為您創建一個實例。

您可以執行此操作以獲取完全解析了依賴項的實例:

var validationRepository = Container.Resolve<ValidationRepository>();

其中“Container”是對Castle Windsor Container的引用,在首先設置Container時,您可能已將其分配給某種IoC Utility類中的靜態屬性。

但是,這將是服務定位器反模式的一個示例,應該避免。 相反,最好讓控制器工廠將控制器實例化視為MVC管道的一部分,然后將所有其他必要的依賴關系作為屬性或構造函數參數進行鏈接。 例如,控制器具有ValidationRepository依賴關系,然后ValidationRepository具有IUserRepo依賴關系等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM