9

Clean Code Talksを聞いて、オブジェクトを作成するためにファクトリを使用する必要があることを理解しました。したがって、たとえば、aHouseDooraDoorがあり、aに、がある場合DoorKnob、でHouseFactorynewを作成し、DoorKnobそれをのコンストラクターにDoor渡し、次にその新しいDoorオブジェクトを。のコンストラクターに渡しますHouse

しかし、House (クラス名がであると言うABCを使用するクラスはどうですか?よろしいHouseFactoryですか?HouseFactoryでは、のコンストラクターにを渡しABCますか?そのようにコンストラクターでたくさんのファクトリーを渡す必要はありませんか?

4

3 に答える 3

10

DoorとDoorKnobの例にとどまり、ファクトリを注入するのではなく、DooKnob自体を注入します。

public class Door
{
    private readonly DoorKnob doorKnob;

    public Door(DoorKnob doorKnob)
    {
        if (doorKnob == null)
            throw new ArgumentNullException("doorKnob");

        this.doorKnob = doorKnob;
    }
}

このレベルでは工場は見えません。

一方、HouseはDoorに依存しますが、DoorKnobには依存しません。

public class House
{
    private readonly Door door;

    public House(Door door)
    {
        if (door == null)
            throw new ArgumentNullException("door");

        this.door = door;
    }
}

これにより、アプリケーションのコンポジションルートですべてをコンポジションする必要があるまで、オプションが開いたままになります。

var house = new House(new Door(new DoorKnob()));

DIコンテナを使用してこのレベルで作成できますが、その必要はありません。工場は関与していません。

于 2012-01-24T07:29:26.347 に答える
2

あまりにも多くのファクトリを注入すると、クラスがやりすぎていることを示すコンストラクターの過剰注入と呼ばれるコードの匂いがします。

多くのコンテナーは、自動ファクトリーと呼ばれる機能を提供します。つまり、生成Func<T>方法を知っていれば、型のファクトリを自動的に生成しTます。

Castle Windsor には、オンザフライでファクトリ インターフェイスの実装を生成するTyped Factory機能と呼ばれる高度な機能があります。

TecX プロジェクトには、Unity 用の型付きファクトリのポートもあります。

于 2012-01-24T07:08:13.707 に答える
0

Unity を使用することになった場合、Unity 用の Castle Windsor Typed Factory に相当するものを最近実装しました。プロジェクトはhttps://github.com/PombeirP/Unity.TypedFactoriesで、NuGet パッケージは http://nuget.org/packages/Unity.TypedFactoriesで見つけることができます。

使用法は次のとおりです。

unityContainer
    .RegisterTypedFactory<IFooFactory>()
    .ForConcreteType<Foo>();

IFooFactory を返すメソッドを使用して IFooFactory インターフェイスを作成するだけで、残りはライブラリによって自動的に行われます。IFooFactory を解決し、それを使用して IFoo オブジェクトをすぐに作成できます。

于 2012-12-06T21:40:59.143 に答える