Является ли хорошей практикой использование CommonServiceLocator для внедрения зависимостей в базовый класс? - PullRequest
2 голосов
/ 21 апреля 2011

В настоящее время, когда мне нужно внедрить зависимости в базовый класс, я использую следующий код:

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
{
}

Это кажется намного проще, но я не уверен, что это хорошая практика.

Спасибо

1 Ответ

4 голосов
/ 21 апреля 2011

Запрос зависимости внутри класса называется Шаблон локатора службы , который является анти-шаблоном . Не допускайте минимизации зависимости между вашим приложением и платформой IoC, даже если это Common Locator.

Я бы все же пошел на первый подход, но я согласен, что если базовый класс всегда нуждается в этой зависимости, и у вас есть много подтипов, это может стать громоздким. В этом случае перейдите к введению свойства:

public class BaseClass
{
    public BaseClass()
    {
    }

    public IService Service { get; set; }
}

Таким образом, ваша библиотека свободна от использования локатора служб. Одно из величайших преимуществ этого подхода для меня заключается в том, что он делает написание юнит-тестов гораздо менее болезненным.

...