使用 CommonServiceLocator 将依赖项注入基类是一个好习惯吗?

3 c# dependency-injection ioc-container common-service-locator

目前,当我需要将依赖项注入基类时,我使用以下代码:

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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我必须在所有子类中编写大量重复代码。为了避免这些重复的代码,我想我可以使用 CommonServiceLocator 将依赖项注入到基类中:

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

public class A : BaseClass
{
}

public class B : BaseClass
{
}
Run Code Online (Sandbox Code Playgroud)

这似乎要简单得多,但我不确定这是否是一个好习惯。

谢谢

Ste*_*ven 5

从类内部请求依赖项称为服务定位器模式,它是一种反模式。防止最小化您的应用程序和 IoC 框架之间的依赖关系,即使它是 Common Service Locator。

我仍然会采用第一种方法,但我同意如果基类总是需要这种依赖关系并且您有许多子类型,这可能会变得很麻烦。在这种情况下,请进行属性注入:

public class BaseClass
{
    public BaseClass()
    {
    }

    public IService Service { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这样您的图书馆就无需使用服务定位器。对我来说,这种方法的最大优点之一是它使编写单元测试的痛苦大大减少。