3

現在、基本クラスに依存性を注入する必要がある場合は、次のコードを使用します。

public class BaseClass
{
    readonly IService _service;
    public BaseClass(IService service)
    {
        _service = service;
    }
}

public class A : BaseClass
{
    public A(IService service) : base(service)
    {
    }
}

public class B : BaseClass
{
    public B(IService service) : base(service)
    {
    }
}

すべてのサブクラスで多くの重複コードを作成する必要があります。これらの重複コードを回避するために、CommonServiceLocatorを使用して依存関係を基本クラスに注入できると思います。

public class BaseClass
{
    readonly IService _service;
    public BaseClass()
    {
        _service = ServiceLocator.Current.GetInstance<IService>();
    }
}

public class A : BaseClass
{
}

public class B : BaseClass
{
}

これははるかに簡単なようですが、これが良い習慣かどうかはわかりません。

ありがとう

4

1 に答える 1

5

クラス内から依存関係を要求することをService Locator Patternと呼びます。これはアンチパターンです。Common Service Locator であっても、アプリケーションと IoC フレームワークの間の依存関係を最小限に抑えないようにします。

私はまだ最初のアプローチに行きますが、基本クラスが常にその依存関係を必要とし、多くのサブタイプがある場合、これは面倒になる可能性があることに同意します。その場合は、プロパティ インジェクションに進みます。

public class BaseClass
{
    public BaseClass()
    {
    }

    public IService Service { get; set; }
}

このようにして、ライブラリは Service Locator を使用する必要がなくなります。私にとって、このアプローチの最大の利点の 1 つは、単体テストを書く手間が大幅に軽減されることです。

于 2011-04-21T05:13:53.087 に答える