1

依存性注入を使用しています。次のような OrderService クラスがあるとします。

public class OrderService{
    public OrderService(
        IOrderValidator validator
        , IOrderRepository repository
        , IOrderNotificator notificator){
        //assign global fields
    }

    public void SubmitOrder(Order ord){
        if(validator.IsOrderValid(ord)){
            repository.InsertNew(ord);
            notificator.Notify(ord);
        }
    }
}

TypeAOrderServiceここで、次のようなコンストラクターで宣言されたコンポーネントを使用して、OrderService によって継承されるように、たとえばファサード クラスを作成することにします。

public class TypeAOrderService : OrderService{
    public TypeAOrderService() : base(
        new OrderValidator(),
        new OrderRepository(),
        new OrderNotificator()) { }
}

(注入されたコンポーネントの複雑さを伴う実装はここでは重要ではありませんが、adapter pattern継承を置き換えることも許容されることに注意してください)。

コンポジションルートで依存関係を定義していないため、ここには欠点があるかもしれません。しかし、状況によってはそれが受け入れられるかどうかは疑問です。特にframework component、DI コンテナーにアクセスしてフレームワークを使用し、自分で解決するのはかなり奇妙です。

アップデート:

コメントで述べたように、現在 IOC コンテナーは使用していません。私の見解では、フレームワークで IOC コンテナーを使用するのは奇妙です。これは、フレームワークを使用するすべてのアプリケーションが IOC コンテナーを使用する必要があることを意味するためです。私の見方が間違っている場合は、遠慮なく訂正してください。

私がフレームワークの例として挙げているのはSystem.Windows.Forms.Form、IOC コンテナーを使用せず、依存関係を判別しない場合などです。

4

1 に答える 1

2

IoC を使用するかどうかについては、フレームワーク ライブラリ内で IoC を使用しても問題ないと思います。これは、フレームワークに独自のコンテナーとコンポジション ルートがあり、そのコンシューマーから完全に隠されていることを意味します。簡単に使用できる Facade クラスを作成できます。このようなもの:

public class OrderServiceFacade
{
    private readonly IOrderService OrderService;

    public class OrderServiceFacade()
    {
        this.OrderService = ContainerWrapper.Container.Resolve<IOrderService>();
    }

    public void SubmitOrder(Order ord) {
        OrderService.SubmitOrder(ord);
    }
}

ContainerWrapper はコンポジション ルートであり、DI コンテナーのラッパーです。

internal class ContainerWrapper
{
    private Container _Container;
    public Container Container
    {
        if(_Container == null)
        {
            //initialize it
        }
        return _Container;
    }
}

もちろん、新しい IOrderService インターフェイスから継承するには、OrderService と TypeAOrderService が必要です。これにより、特定の実装を直接インスタンス化するのではなく、コンストラクターでインターフェイスを使用できるため、TypeAOrderService が OrderService から分離されます。TypeAOrderService で OrderService のメソッドを呼び出す必要がある場合は、Decorator パターンを使用して、追加の依存関係として TypeAOrderService に IOrderService を取得させることができます。

于 2013-05-16T21:08:53.663 に答える