【问题标题】:Dnn Dependency Injection - error occurred when trying to create a controller... make sure the controller has a parameterless public constructorDnn 依赖注入 - 尝试创建控制器时发生错误...确保控制器具有无参数的公共构造函数
【发布时间】:2020-08-26 15:40:01
【问题描述】:

我有一个用于 Web API 的 Dnn 模块项目。在启动时我想为这个模块配置依赖注入。

我得到的错误是:“尝试创建 'SchoolsController' 类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。”

内部异常在实际问题上更清楚一些:“在尝试激活 'MyProj.Persistence.UnitOfWork.UnitOfWork' 时,无法解析类型 'MyProj.Persistence.Context.PortfolioContext' 的服务。”

我猜这是因为我的 UnitOfWork 类构造函数需要 DbContext?

我的工作单元类如下所示:

public class UnitOfWork: IUnitOfWork, IDisposable
{
    private readonly PortfolioContext context;

    public UnitOfWork(PortfolioContext context)
    {
        this.context = context;
        Schools = new SchoolRepository(context);
        Users = new UserRepository(context);
    }
}

我的控制器如下所示:

public class SchoolsController: BaseController
{
    private readonly IUnitOfWork unitOfWork;

    public SchoolsController(IUnitOfWork unitOfWork)
    {
        this.unitOfWork  = unitOfWork;
    }
} 

我的创业班:

public class Startup : IDnnStartup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IUnitOfWork, UnitOfWork>();
    }
}

我曾尝试在像这样添加作用域 UnitOfWork 之前添加 DbContext,但它不起作用:

services.AddSingleton<DbContext, PortfolioContext>((ctx) =>
{
    return new PortfolioContext();
});

任何想法如何在 Dnn 中做到这一点?通常我会通过执行以下操作来添加 DBContext:

services.AddDbContext<DataContext>(x => x.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));  

但由于某种原因,我在此上下文中的任何地方都找不到扩展方法 AddDbContext(Dnn、IDnnStartup 等)

编辑:
忘了补充这是针对 Dnn 9.6.2 的,它针对 .net 4.7.2

【问题讨论】:

  • 如果是API,不应该从DNNApiController引用吗?
  • @erw13n 抱歉,我的控制器继承的 BaseController 实际上继承自 DnnApiController

标签: dependency-injection dotnetnuke dbcontext dnn9


【解决方案1】:

原来我离得不远了。

我最初尝试这个的地方:

services.AddSingleton<DbContext, PortfolioContext>((ctx) =>
{
    return new PortfolioContext();
});

实际上应该是这样的:

services.AddSingleton<PortfolioContext>((ctx) =>
{
    return new PortfolioContext();
});

【讨论】:

  • 具有讽刺意味的是,这适用于 Dev 和 Staging,但是当我尝试部署到生产环境时,我突然收到“无法解析类型 '....IUnitOfWork' 的服务”
  • 解决了生产问题。 EntityFramework.dll 和 EntityFramework.SqlServer.dll 没有安装
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 2022-11-04
  • 2019-04-13
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多