【问题标题】:Controller cannot reach Controller in other project because of constructor ASP:NET Core由于构造函数 ASP:NET Core,控制器无法访问其他项目中的控制器
【发布时间】:2020-09-01 01:29:29
【问题描述】:

我是 ASP.NET Core 的新手,我正在尝试解决这个问题一个星期。 我有两个项目的解决方案。 当我启动项目时,浏览器只会说: InvalidOperationException:尝试激活“TSM_Programm.Controllers.ResourcesController”时无法解析“TSM_Programm.Data.TSMContext”类型的服务。

解决方案的第一部分是我的 API 层,它将数据传递给用户(目前通过邮递员)。 第二个项目是我的数据访问层。 该层包含多个控制器,它们都使用相同的构造函数,如下所示:

public TSMContext _context;

        public ResourcesController(TSMContext context)
        {
            _context = context;
        }

TSMContext 类如下:

namespace TSM_Programm.Data
{
    public class TSMContext : DbContext
    {

        public TSMContext(DbContextOptions<TSMContext> options)
            : base(options)
        {
        }


        public DbSet<Resource> Resources { get; set; }     
        public DbSet<Parameter> Parameters { get; set; }
        public DbSet<ResourceToParameter> ResourceToParameters { get; set; }

        public DbSet<Reservation> Reservations { get; set; }
    }

到目前为止,上帝,但是当我尝试启动程序时,API 层的控制器似乎无法处理构造函数。

这是我的 API 控制器:

namespace TSM_API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class APIController : ControllerBase  //Base Class without View Support
    {


        //Troublemaker
        public ResourcesController _resources;
        public ParametersController _parameters;
        public ReservationsController _reservations;


        public APIController(ResourcesController resources, ParametersController parameters, ReservationsController reservations)
        {
            _resources = resources;
            _parameters = parameters;
            _reservations = reservations;
        }
        //Function to check if controller works
        //GET: api/API
        [HttpGet]
        public IEnumerable<string> Get()
        {
           // ResourcesController controller = new ResourcesController();
            return new string[] { "value1", "value2" };
        }

API-Controller 无法使用自己的构造函数,这就是我更改 Startup.cs 的原因。

namespace TSM_API
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddMvc().AddApplicationPart(typeof(ResourcesController).Assembly).AddControllersAsServices();
            services.AddMvc().AddApplicationPart(typeof(ParametersController).Assembly).AddControllersAsServices();
            services.AddMvc().AddApplicationPart(typeof(ReservationsController).Assembly).AddControllersAsServices();
            services.AddMvc().AddApplicationPart(typeof(TSMContext).Assembly).AddControllersAsServices();


        }

我完全不知道如何解决这个问题,因为我无法将 TSMContext 类添加为服务。 知道如何解决吗?

谢谢。

【问题讨论】:

    标签: asp.net asp.net-core dependency-injection constructor dependencies


    【解决方案1】:

    我看到您没有将您的 dbcontext 注册为依赖注入。您的问题可能是由于 ResourceController 尝试以 DI 身份访问 _context 但未注册。要将上下文用作依赖注入,请将其注册到startup.cs,如下所示。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<TSMContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YOUR_CONNECTION_STRING")));
    
    //If you have any services that should be used as DI, then they also must be registered as like this
        services.AddScoped<Interface, Class>(); //Interface refer to the service interface while class is the actual service you will use.
    }
    

    【讨论】:

    • 我工作了!太感谢了。我现在工作正常,我可以在我的 APIController 中使用 ResourcesController 中的方法。就像我需要它一样。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 2010-11-03
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多