如果已经回答,请道歉。我已经搜索过,无法找到解决方案。
如何在#5的MVC中注入一个带构造函数参数的类?它甚至可能吗?
对于下面的代码,它会出错,因为它无法构造被注入的MyHelper1,因为它缺少sqlContext参数。
以下是我的(简化)对象:
// 1. HELPER CLASS TO INJECT
public class MyHelper1 : HelperBase, IHelper
{
public MyHelper1(IHelperSqlContext sqlContext) : HelperBase(sqlContext)
public override string HelperTag { get; } = "HELPER1";
. . .
}
// 2. BASE HELPER
public abstract class HelperBase
{
private IHelperSqlContext _sqlContext;
abstract public string HelperTag { get; }
public HelperBase(IHelperSqlContext sqlContext)
{
_sqlContext = sqlContext;
}
public List<HelperRecords> GetRecords(Id id)
{
return _sqlContext.GetRecords(id);
}
. . .
}
// 3. INTERFACE
public interface IHelper
{
. . .
}
// 4. CONTROLLER
public class MyController : Controller
{
IHelper _myHelper
public MyController(IHelper myHelper)
{
_myHelper = myHelper;
}
public IActionResult Index(Id id)
{
var model = new MyViewModel();
model.MyRecords = _myHelper.GetRecords(id);
return View(model);
}
}
// 5. STARTUP - INJECT PART
public class Startup
{
. . .
public void ConfigureServices(IServiceCollection services)
{
. . .
// How to pass MyHelper1 class with IHelperSqlContext here???
services.AddTransient<IHelper, MyHelper1>();
}
}
感谢任何帮助。提前谢谢。
答案 0 :(得分:0)
是的,您需要做的就是在Startup类的ConfigureServices方法中注册所有依赖项(也就是依赖项依赖项)。
所以在这种情况下你需要添加这样一行。
services.AddTransient<IHelperSqlContext, MyHelperSqlContext>();
您可以在Microsoft文档中获取有关依赖项注入的更多信息here。
答案 1 :(得分:0)
所有依赖项都需要在DI容器中注册,以便它知道如何解决它及其依赖项。
以下假设抽象是作为DbContext派生类实现的。
public class Startup {
//. . .
public void ConfigureServices(IServiceCollection services) {
//. . .
//Register your context with dependency injection
services.AddDbContext<HelperSqlDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
);
//register the context with its abstraction
service.AddScoped<IHelperSqlContext, HelperSqlDbContext>()
services.AddTransient<IHelper, MyHelper1>();
}
}