2009-05-13 10 views
4

DIを使用してビジネスレイヤーを構築するプロジェクトがありますが、私は追加ステップを実行し、Windsorを使用してオブジェクト構築を管理しようとしています。城ウィンザー:基本的な型がアセンブリにアクセスできない場合、ファクトリメソッドを登録するにはどうすればよいですか?

のは、ちょうど私が次のインターフェイスを介してアクセスすることができ、既存のデータ層(私は変更したくないということ)、あるとしましょう:私のビジネス層のクラスの

interface IDataFactory { 
    IDataService Service { get; } 
} 

シリーズ

IFactory factory = DataFactory.NewFactory(); 
IBusinessService service = new ConcreteBusinessService(factory.Service); 

私は城ウィンザーコンテナにIBusinessServiceを登録するために、私はこのようなコードを使用したいということを理解:

IDataFactoryを通じて公開されるサービスに依存して

私の人生の間、自分の既存のファクトリオブジェクトを使用して、データレイヤからサービスを登録する方法がわかりません。要するに、私が言いたい:

container.AddComponent("dataService", typeof(IDataService), factory.service); 

ウィンザーは私がcontainer.AddComponent( "DataServiceの"、typeof演算(IDataService)、typeof演算(SomeConcreteDataService)を)言いたいようだが、この場合には、 ConcreteDataServiceはそのアセンブリの内部にあり、したがって私の中ではアクセスできません。

SomeConcreteDataServiceが自分のアセンブリに認識されていないとすれば、データサービスを配線する方法はありますか?


This questionは、私の場合を除いて、私自身に非常に似て、AddComponent( "電卓"、typeof演算(ICalcService)、typeof演算(CalculatorService)、 "作成" を参照)。コールは機能しません - CalculatorServiceは別のアセンブリの内部にあり、コンテナのアセンブリ配線には使用できません。

答えて

13

[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); 
    } 
} 

詳細についてはfluent API wiki pageを参照してください。

0

答えは、実装タイプを心配する必要はありません、次のとおりです。

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"]; 

私はカーネルに、特定の実装タイプで渡されていなかったので、私は、私はそれが正常に実行されました「おっと」瞬間がありましたウィンザー2.0使用.AddComponent()

関連する問題