我正在使用Castle Windsor的子容器功能來覆蓋在工廠方法中使用特定實例註冊特定類型。我純粹使用子容器,以便註冊對於單個解決方案是臨時的 - 換句話說,我不希望註冊影響該類型的所有解決方案。使用Castle Windsor子容器來解析具有特定實例的類型
也許有些代碼會解釋我的意思。
我有一個充當工廠的Func Func<IReportCategory, IReportCategoryViewModel>
- 我給它一個IReportCategory的實現,它返回一個IReportCategoryViewModel的新實例。 (IReportCategoryViewModel依賴於IReportCategory)。
container.Register(
Component.For<Func<IReportCategory, IReportCategoryViewModel>>().Instance(
category => ResolveCategoryViewModelFactory(container, category)));
凡ResolveCategoryViewModelFactory
是實現如下:
private CategoryViewModel ResolveCategoryViewModelFactory(IWindsorContainer container, IReportCategory category)
{
using (IWindsorContainer childContainer = new WindsorContainer())
{
childContainer.Register(Component.For<IReportCategory>().Instance(category));
container.AddChildContainer(childContainer);
return childContainer.Resolve<IReportCategoryViewModel>();
}
}
什麼上面的方法實現是IReportCategoryViewModel的分辨率,注入的具體實例
這與溫莎城堡如下注冊IReportCategory作爲依賴項。如果IReportCategoryViewModel具有其他需要滿足的依賴關係,那麼這些將被容器自動注入。
隨後,我可以使用函數功能如下:
public class Test
{
private readonly Func<IReportCategory, IReportCategoryViewModel> factory;
public Test(Func<IReportCategory, IReportCategoryViewModel> factory)
{
this.factory = factory;
}
public void ResolveTest()
{
// Create a category (note: this would probably be resolved from the container in some way)
IReportCategory category = new ReportCategory();
// Call into the factory to resolve the view model
IReportCategoryViewModel vm = factory(category);
}
...
問:這是否看起來像一個合適的事是什麼?從我得到的印象來看,Castle Windsor不推薦使用兒童容器 - 是否有另一種達到相同結果的方式?
感謝您的幫助。
鍵入工廠確實是一個更好的方式來做到這一點!非常感謝Krzysztof! –
這並不完全導致與子容器相同的行爲 - 因爲它使用名稱將構造函數參數與工廠方法參數相匹配,它僅適用於工廠本身返回的類型,這意味着它的任何依賴項都不會「如果它們需要注入,則將實例傳遞給工廠方法。以下是我一直在探索的一個要點(這可能更好地解釋:))https://gist.github.com/1357829 – GraemeF