1
私は私のIoCコンテナで、次の工場をインストールしている

TypedFactoryFacilityを使用していますか?

public interface IServiceFactory 
{ 
    T Create<T>(); 
    void Release(object service); 
} 

そして、私のコントローラは、このようなものになります:

// Factory for late-binding scenarios 
container.AddFacility<TypedFactoryFacility>(); 
container.Register(
    Component 
     .For<IServiceFactory>() 
     .AsFactory() 
); 

IServiceFactoryがある

public class PostsController : BaseController 
{ 
    private readonly IServiceFactory serviceFactory; 

    private LinkService linkService 
    { 
     get { return serviceFactory.Create<LinkService>(); } 
    } 

    public PostsController(IServiceFactory serviceFactory) 
    { 
     if (serviceFactory == null) 
     { 
      throw new ArgumentNullException("serviceFactory"); 
     } 
     this.serviceFactory = serviceFactory; 
    } 

全体のポイントをたとえLinkServicePerWebRequestのライフスタイルがあっても、私はいつもそれが必要なわけではないかもしれないので、それを注入する直接私に間違っているようです。

ここで気になる質問は、コンテナをサービスロケータとして使用していますか?

答えて

4

Tが無制限の場合(この場合)、あなたはそうです。あなたは受け取るクラスに作成する型の知識を入れています。この設定は、コンテナを設定する責任を負うクラスに委ねるのが一番です。 Castle 3.0では、解像度を遅らせるためにLazy<T>を使用するオプションがあります。ここで簡単に行うことができます。

public PostsController(Lazy<ILinkService> linkService) 
{ 
    if (linkService == null) 
    { 
     throw new ArgumentNullException("linkService"); 
    } 

    this.linkService = linkService; 
} 
+0

ニース、これは私が欲しかった、エレガントかつ簡潔です。 – bevacqua

+0

参照:http://docs.castleproject.org/Windsor.Whats-New-In-Windsor-3.ashx#Added_support_for_Lazy__components_3 – codekaizen

+0

Lazy に依存することは、本質的に漏洩抽象です。それは何の目的ですか?怠惰な初期化?その場合、バーチャルプロキシはよりクリーンなデザインを提供します:http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –

2

はい、あなたはusing the container as a Service Locatorです。

+0

興味深いブログエントリ。しかし、実際に怠惰なインスタンス化をしなければならない状況をどう対処しているのか、ブログではわかりませんでしたか?たとえば、循環参照を含む[この問題](http://stackoverflow.com/questions/9088534/create-components-with-circular-relationships-using-castle-windsor)があり、私が思いつく唯一の解決策TypedFactoryを使うことでした。 –

+0

TypedFactoryの使用に問題はありません。問題は、この特定のケースで(無制限の 'T 'で)どのように使用されているかです。 –

関連する問題