在我的 asp.net 核心应用程序中,我有被注入(inject)到几乎所有服务的依赖类。所以我想构建一个基本服务类来获取这些属性的依赖项,我的服务继承这个基本服务类。
public abstract class BaseService
{
protected Foo Foo { get; set; }
protected Bar Bar { get; set; }
public BaseService(Foo foo, Bar bar)
{
Foo = foo;
Bar = bar;
}
}
public class Service : BaseService
{
public Service(IOtherDependency otherDependency) { }
public void Method()
{
var value = Bar.value;
Foo.Do(value);
}
}
因此,对于给定的代码,它警告我使用提供的参数调用基本构造函数,但是它们是将在运行时注入(inject)的参数,我不想要它。如果我添加无参数构造函数,它不会调用我需要的参数化构造函数。
我不想在继承的服务中调用或定义任何注入(inject)基础服务(Foo
和 Bar
)的类,我该怎么做?
顺便说一句,Foo
和 Bar
类作为单例注入(inject)到容器中,以防它们的生命周期很重要。
最佳答案
This正是我要找的。p>
我按照上面的帖子修改了我的 Controller 基础代码。
对于我在问题中提出的服务方面;因为他们不使用 HttpContext
像内置的 Controller
基类,我只注入(inject)IServiceProvider
将类添加到我的 BaseService,因此无论我在所有服务中需要什么,我都可以通过 provider.GetService()
将其获取到属性中.
public abstract class BaseService
{
protected Foo Foo { get; set; }
protected Bar Bar { get; set; }
public BaseService(IServiceProvider provider)
{
Foo = provider.GetService<Foo>();
Bar = provider.GetService<Bar>();
}
}
public class Service : BaseService, IService
{
public Service(IOtherDependency otherDependency, IServiceProvider provider) : base(provider) { }
public void Method()
{
var value = Bar.value;
Foo.Do(value);
}
}
public class SomeController : BaseController
{
private readonly IService _service;
public SomeController(IService service)
{
_service = service;
}
public IActionResult Index()
{
//call method
_service.Method();
}
}
关于c# - asp.net 核心构造函数注入(inject)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52982560/