簡體   English   中英

Castle Windsor:當我的裝配無法訪問基礎類型時,如何注冊工廠方法?

[英]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.

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