gpt4 book ai didi

c# - 抽象类构造函数可以实例化一个新对象吗?

转载 作者:行者123 更新时间:2023-11-30 19:26:13 26 4
gpt4 key购买 nike

我有一组服务被注入(inject)到我的 Controller 中。我的抽象类构造函数可以实例化常用对象的新实例吗?

public class ReportService : AReportService, IReportService
{
private readonly IMyService _myservice;
public ReportService(IMyService myService) : base ()
{
_myservice = myService;
}

public void MyMethodForThisService(string someProperty)
{
_parentService.DoSomething(someProperty);
}
}

public abstract class AReportService
{
protected readonly ParentService _parentService;
protected AReportService()
{
_parentService = new ParentService();
}

protected void MyFirstSharedMethodForAllServices(string someProperty)
{
_parentService.DoSomethingElse(someProperty);
}
}

最佳答案

Jon Skeet(和往常一样)是正确的——您可以做到这一点。但是,由于您在子 Controller 中遵循依赖注入(inject)模式,因此您也应该为父类使用依赖注入(inject)。

您可以通过将依赖项注入(inject)父类的构造函数来做到这一点,但您可能已经注意到,这需要所有子类注入(inject)相同的对象并进行传递,这会随着您添加更多依赖项而变得烦人.

或者,您可以进行属性注入(inject),但这很容易忘记用需要注入(inject)的新属性更新单元测试。

作为折衷,我经常使用方法注入(inject),其中基类有一个初始化依赖项的“InjectDependencies”方法。不幸的是,这不允许您将依赖项设置为只读,并且仍然可以在不提供依赖项的情况下构建对象。

最后一个选择是创建一个专门用于包含父类依赖项的特殊类,然后将那个类注入(inject)到父类的构造函数中。然后,子类只需要将一个参数传递给父构造函数,您以后可以自由添加依赖项,这不会影响子类,但会警告尝试手动构造依赖项对象的单元测试。

您还应该仔细考虑您是否在应该使用组合的情况下使用继承。 MyFirstSharedMethodForAllServices() 只是您碰巧知道多个服务将使用的一种便捷方法吗?为什么不使用这个方法创建一个单独的类,所有这些服务都可以注入(inject)?这将为您提供更大的灵 active ,例如,独立地对 MyFirstSharedMethodForAllServices() 进行单元测试。它还使您的服务可以自由地扩展一些其他基于更"is"式关系的类。

关于c# - 抽象类构造函数可以实例化一个新对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24540081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com