Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用CommonServiceLocator将依赖项注入基类是一种好的做法吗?_C#_Dependency Injection_Ioc Container_Common Service Locator - Fatal编程技术网

C# 使用CommonServiceLocator将依赖项注入基类是一种好的做法吗?

C# 使用CommonServiceLocator将依赖项注入基类是一种好的做法吗?,c#,dependency-injection,ioc-container,common-service-locator,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 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
{
}
公共类基类
{
只读设备服务;
公共基类()
{
_service=ServiceLocator.Current.GetInstance();
}
}
公共A类:基本类
{
}
公共类B:基本类
{
}
这似乎简单得多,但我不确定这是否是一个好的做法


谢谢

从类中请求依赖项称为,这是一个。阻止以最小化应用程序与IoC框架之间的依赖关系,即使它是公共服务定位器

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

public class BaseClass
{
    public BaseClass()
    {
    }

    public IService Service { get; set; }
}

这样,您的库就不用使用服务定位器了。对我来说,这种方法的最大优点之一是,它使编写单元测试的痛苦大大减轻。

简短回答:不,不要使用服务定位器。这里没有重复的代码。@Mauricio Scheffer:没有重复的代码吗?我必须将
(iSeries服务):base(服务)
放入所有子类的构造函数中。有时,我为子类创建构造函数的唯一原因是将依赖项注入基类。。。。在阅读了您的答案之后,我决定对BaseViewModel和其他具有许多子类的基类使用属性注入。这节省了很多代码。谢谢你的回答和链接!