Rob*_*ert 2 c# inheritance abstract
我有一组服务注入我的控制器.我的抽象类构造函数可以实例化常用对象的新实例吗?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的抽象类构造函数可以实例化常用对象的新实例吗?
绝对.抽象类的构造函数基本上可以完成普通构造函数所能做的任何事情.唯一的限制是您只能将构造函数作为链接的一部分从另一个构造函数调用.
Jon Skeet(像往常一样)是正确的——你可以这样做。但是,由于您的子控制器遵循依赖注入模式,因此您可能也应该对父类使用依赖注入。
您可以通过将依赖项注入父类的构造函数来实现这一点,但您可能已经注意到,这需要所有子类注入相同的对象并进行传递,当您添加更多依赖项时,这会变得很烦人。
或者,您可以进行属性注入,但这很容易忘记使用需要注入的新属性更新单元测试。
作为妥协,我会经常使用方法注入,其中基类有一个“InjectDependencies”方法来初始化依赖项。不幸的是,这不允许您将依赖项设为只读,并且仍然可以在不提供依赖项的情况下构造您的对象。
最后一个选择是创建一个特殊的类来包含父类的依赖项,然后将该类注入到父类的构造函数中。然后子类只需要将单个参数传递给父构造函数,以后您可以自由添加依赖项,这不会影响子类,但会警告尝试手动构造依赖项对象的单元测试。
您还应该仔细考虑是否在应该使用组合的情况下使用继承。是否MyFirstSharedMethodForAllServices()只是你碰巧知道一些服务将使用一个方便的方法?为什么不使用这个方法创建一个单独的类,所有这些服务都可以注入?这将为您提供更大的灵活性,例如,MyFirstSharedMethodForAllServices()独立进行单元测试。它还使您的服务可以自由地基于更“是”风格的关系扩展一些其他类。