[英]Castle Windsor: How do I register a factory method, when the underlying type isn't accessible to my assembly?
我有一個項目,其中我的業務層是使用DI構建的,但我正在嘗試額外的步驟並使用Windsor來管理對象構造。
我們只是說我有一個預先存在的數據層(我不想修改),可以通過以下界面訪問:
interface IDataFactory {
IDataService Service { get; }
}
我的業務層中的一系列類依賴於通過IDataFactory公開的服務:
IFactory factory = DataFactory.NewFactory();
IBusinessService service = new ConcreteBusinessService(factory.Service);
我知道為了將IBusinessService注冊到Castle Windsor容器,我會使用類似於此的代碼:
IWindsorContainer container = new WindsorContainer();
container.AddComponent("businessService", typeof(IBusinessService), typeof(ConcreteBusinessService));
但對於我的生活,我無法弄清楚如何使用我現有的工廠對象從我的數據層注冊服務。 從本質上講,我想說:
container.AddComponent("dataService", typeof(IDataService), factory.service);
Windsor似乎要我說容器.AddComponent(“dataService”,typeof(IDataService),typeOf(SomeConcreteDataService) ),但在這個實例中,ConcreteDataService是該程序集的內部,因此在我的程序中無法訪問。
鑒於我的程序集不知道SomeConcreteDataService,我將如何進行數據服務的連接?
這個問題與我自己的問題非常類似,除了我的情況,AddComponent(“計算器”,typeof(ICalcService),typeof(CalculatorService),“Create”); 調用不起作用 - CalculatorService將在另一個程序集內部,不可用於組件連接容器。
使用Windsor 2.0:
[TestFixture]
public class WindsorTests {
public interface IDataService {}
public class DataService: IDataService {}
public interface IDataFactory {
IDataService Service { get; }
}
public class DataFactory: IDataFactory {
public IDataService Service {
get { return new DataService(); }
}
}
[Test]
public void FactoryTest() {
var container = new WindsorContainer();
container.AddFacility<FactorySupportFacility>();
container.AddComponent<IDataFactory, DataFactory>();
container.Register(Component.For<IDataService>().UsingFactory((IDataFactory f) => f.Service));
var service = container.Resolve<IDataService>();
Assert.IsInstanceOfType(typeof(DataService), service);
}
}
有關詳細信息,請參閱流暢的API Wiki頁面 。
得到它了。 答案是,您不必擔心實現類型:
IWindsorContainer container = new WindsorContainer();
container.AddFacility("factories", new FactorySupportFacility());
container.AddComponent("standard.interceptor", typeof(StandardInterceptor));
container.AddComponent("factory", typeof(DataFactory));
MutableConfiguration config = new MutableConfiguration("dataService");
config.Attributes["factoryId"] = "factory";
config.Attributes["factoryCreate"] = "get_Service";
container.Kernel.ConfigurationStore.AddComponentConfiguration("dataService", config);
container.Kernel.AddComponent("dataService", typeof(IDataService));
IDataService dataService = (IDataService) container["dataService"];
當我看到它成功執行時,我有一個“哇”的時刻,因為我沒有將特定的實現類型傳遞給Kernel.AddComponent()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.