为具有继承自类A的类B的DI设置DI是否可行,这反过来实现了接口I,就像这样:
public interface I {
SomeMethod();
}
public abstract class A : I {
//some code ...
}
public class B : A {
//some code...
}
问题是DI是否可以在这样的方案上工作,我的意思是为B类设置DI?
答案 0 :(得分:1)
通常,DI容器(例如Castle,Unity,Autofac等)使您可以区别类型注册和接口链接。
F.e。在Autofac中,您可以注册单一类型并声明一些基类和接口:
builder.RegisterType<B>()
.AsSelf()
.As<A>()
.As<I>();
现在,当您需要B
类,B
类或A
接口时,将解析I
类的实例。
答案 1 :(得分:0)
如果你使用的是 ASP.NET Core,你可以简单地使用一个通用的 Base Controller 类:
public abstract class BaseController<T> : Controller
{
private IFoo _fooInstance;
private IBar _barInstance;
protected IFoo _foo => _fooInstance ??= HttpContext.RequestServices.GetService<IFoo>();
protected IBar _bar => _barInstance ??= HttpContext.RequestServices.GetService<IBar>();
}
如果您使用的是 Razor 页面:
class BasePageModel<T> : PageModel where T : class
{
private IFoo _fooInstance;
private IBar _barInstance;
protected IFoo _foo => _fooInstance ??= HttpContext.RequestServices.GetService<IFoo>();
protected IBar _bar => _barInstance ??= HttpContext.RequestServices.GetService<IBar>();
}