2016-04-01 5 views
0

私が正しくファクトリパターンを理解していれば、私は...のIoCとファクトリパターン

public interface IRepoFactory 
{ 
    T Get<T>() where T : IRepo 
} 

そして、その工場でRepoFactory.Get<IRepo1>()意志への呼び出しを、このようなインターフェイスを実装し、私のレポを作成するための工場を持っているかもしれませんIRepo1を実装するクラスの新しく作成されたインスタンスを返します。

ので、RepoFactoryの定義に私は、私はパラメータとして、取りRepofactoryのコンストラクタを定義することができ、想定し、...

switch(...) 
{ 
    case typeof(IRepo1): 
    return new Repo1();   
} 

を適切な型の新しいインスタンスを作成したりしますすべての可能な戻り値の型を表すインターフェイス...

public RepoFactory(IRepo1 repo1, IRepo2 repo2, ..., IRepoN repoN) : IRepoFactory 

私のIoCコンテナは、クラスを作成する作業を行います。

だから、私の質問に。私がの場合上記のようにコンストラクタを作成すると、コンストラクタパラメータとしてIRepoFactoryを含めるたびに、Repo1、Repo2、...、RepoNの新しいインスタンスが作成されます。それはリソースの重いプロセスですか?どのような場合でも、利用可能なレポの総数のサブセットのみが必要な場合は、無駄なやり方ですか?

IoC(私の場合はUnity)を取得する方法は必要なときにインスタンスを作成するだけですか?レイジーロード?それとも、私は何も心配していませんか?

+1

私はUnityを使用していませんが、AutofacとStructureMapは両方ともオブジェクトファクトリをボックスから取り出すことができます。コンストラクタパラメータを関数、つまりMyClass(Func > repoFactory)にします。次に、依存関係を取っているクラスで、var repo = repoFactory()と言うと、新しいインスタンスを取得できます。 Unityにも同様の機能があります。 – Nelson

+0

私はdocs @ Nelson、Taを通して別の噂をするでしょう。 –

答えて

1

。工場はインスタンスを作成する必要があります。これは、DiコンテナやLifeTimeScopeの横の工場コンストラクタには何も置かれてはならないということです。

独自の工場を使用することも、自動生成工場を使用することもできます。

私はよく似ていませんがユニティですが、確認しました。

public class MyService : IMyService 
    { 
     private readonly Func<IRepo1> _repo1; 

     public MyService(Func<IRepo1> repo1) 
     { 
      _repo1 = repo1; 
     } 

     public void Method1() 
     { 

      var myRepo = _repo1(); 
     } 

     public void Method2() 
     { 
      //Repo1 instance will be different than in Method1 
      var myRepo = _repo1(); 
     } 
    } 
1

コンテナがある場合、必要に応じてコンテナにレポの種類を解決させることができます。

これはどのように行うことができるのかの大まかな例です。特定のコンテナに合うようにコードを変更することに注意してください。また、ここでは、コンテナを設定して、必要なタイプを解決するためにホットを知っておくことも前提としています。

public class DefaultRepoFactory : IRepoFactory { 
    IUnityContainer container; 

    public DefaultRepoFactory(IUnityContainer container) { 
     this.container = container; 
    } 

    public T Get<T>() where T : IRepo {   
     return (T)container.Resolve<T>(); 
    } 
} 

あなたはFactoryを誤解設定

IUnityContainer myContainer = new UnityContainer(); 
IRepoFactory myDefaultFactory = new DefaultRepoFactory(myContainer); 
myContainer.RegisterInstance<IRepoFactory>(myDefaultFactory); 
+0

ジェネリックメソッドの代わりにジェネリッククラスを使用し、ジェネリックファクトリを登録する方が良いでしょうか。今私たちのサービスでは 'IRepoFactory'がありますが、どのリポジトリを使うのか分かりません。ジェネリッククラスに変更すれば、これは 'MyService(IRepoFactory repo1)' –

+0

のようになりますが、IUnityContainerへの依存は良い選択ではないと主張したいと思います。 – AksharRoop