2017-03-04 3 views
2

は、コードを持っている:工場でUnityContainerを使用するのは悪いですか?

class MyFactory : IMyFactory 
{ 
    private IUnityContainer _container; 

    public MyFactory(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public IMyInterface Create() 
    { 
     _container.Resolve<IMyInterface>(); 
    } 
} 

は私が傍受ロジックが必要なので、ユニティを使用してIMyInterfaceというを解決する必要があります。 コンテナを工場に投入するのは悪いですか?

+0

私もそうしているので、私は望んでいない;)。しかし、私は通常、 'Create'メソッドのインタフェースではなく、具象クラスを解決します。 –

+0

@ThomasLevesque状況によりますが、私はコンテナを含まない方がいいです。以下の私の答えを参照してください – Backs

答えて

1

一般的に - はい、悪いです:service locator antipatternのように見えるので、コンテナを渡してすべてを解決できます。このコードを維持しテストするのは難しいです。

あなたは工場出荷時のパターンをこのように実装することができます。

class MyFactory : IMyFactory 
{ 
    private Func<IMyInterface> _myInterface; 

    public MyFactory(Func<IMyInterface> myInterface;) 
    { 
     _myInterface = myInterface; 
    } 

    public IMyInterface Create() 
    { 
     return _myInterface(); 
    } 
} 

だから、あなたの工場は、コンテナを保持していません。あなたの工場に注入すると、ユニティコンテナはあなたのクラスを解決するためにFuncを生成します。

詳細情報自動工場のセクションhere

+0

これは、 'Create'メソッドがコンストラクタに渡すパラメータを取る場合を除いて、素晴らしいアプローチです。 –

関連する問題