0

フォームの既存のクラスを適応させるにはどうすればよいですか。

public class A
{
    A(IDependency1 obj1, IDependency2 obj2)
    {
      // ...
    }
}

このようなものに:

public class A
{
    private List<IDependency2> _things;

    A(IDependency1 obj1)
    {
        _things = new List<IDependency2>();
        foreach (var x in someCollection)
            _things.Add(NewInstanceOf<IDependency2>());
    }
}

重要な点は、最初の例obj2ではのシングルトンインスタンスであるということIDependency2です。2番目の例では、予測できない数のインスタンスIDependency2が作成されます。

コンストラクターにパラメーターを含めることを検討しましたが、より明確になるため、Func<IDependency2>使用することを提案した知人と話し合いました。IDependencyResolver

4

2 に答える 2

2

DIでは、インターフェースは依存関係に関するコントラクトとして機能します。あなたが言うように存在するでしょう

予測できない数のIDependency2のインスタンス

これは、あらゆる種類の注入されたコレクションに対して私に悲鳴を上げます

例:

interface IDependency2List
{
    IEnumerable<IDependency2> Items;
}
interface IDependency2
{
    //bla
}
public class A
{
    public A(IDependency1 dep1, IDependency2List dep2List)
    {

    }
}
于 2012-11-16T14:56:35.977 に答える
0

次のようなファクトリインターフェイスを追加できます。

public interface IDependencyFactory<T> where T : class, new()
{
    T Create();
}

そして簡単な実装:

public class SimpleDependencyFactory<T> where T : class, new()
{
    public T Create()
    {
        return new T();
    }
}

次に、クラスコンストラクターはファクトリをパラメーターとして受け取ります。

public class A
{
    private List<IDependency2> _things;

    public A(IDependency1 obj1, IDependencyFactory<IDependency2> dep2Factory)
    {
        _things = new List<IDependency2>();
        foreach (var x in someCollection)
            _things.Add(dep2Factory.Create());

    }
}

ただし、これはコンパイルされませんsomeCollection。また、この例ではobj1が使用されることはありません。そもそもなぜ追加したのかわかりません。ファクトリの強力な点は、パラメータのないコンストラクタを使用してオブジェクトを作成するだけではなく、より複雑な実装を追加できることです。さまざまなファクトリパターンを探します。人気のあるものは、ファクトリメソッドとアブストラクトファクトリです。

于 2012-11-16T18:59:45.407 に答える