Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决.net内核中Web API构造函数的依赖关系_C#_Dependency Injection_Asp.net Core_Asp.net Core Mvc_Asp.net Core Webapi - Fatal编程技术网

C# 如何解决.net内核中Web API构造函数的依赖关系

C# 如何解决.net内核中Web API构造函数的依赖关系,c#,dependency-injection,asp.net-core,asp.net-core-mvc,asp.net-core-webapi,C#,Dependency Injection,Asp.net Core,Asp.net Core Mvc,Asp.net Core Webapi,我不熟悉.net核心和依赖注入概念。我想在WebAPI构造函数中注入服务接口,服务接口和实现在不同的项目中。请查看我的应用程序的以下各层 在startup.cs中,我已经添加了以下行 public void配置服务(IServiceCollection服务) { //添加框架服务。 services.AddMvc(); services.AddSingleton(); } 我的控制器 公共类EntriesController:控制器 { IEntriesService入口服务; 公共入口控制

我不熟悉.net核心和依赖注入概念。我想在WebAPI构造函数中注入服务接口,服务接口和实现在不同的项目中。请查看我的应用程序的以下各层

在startup.cs中,我已经添加了以下行

public void配置服务(IServiceCollection服务)
{
//添加框架服务。
services.AddMvc();
services.AddSingleton();
}
我的控制器

公共类EntriesController:控制器
{
IEntriesService入口服务;
公共入口控制器(IEntriesService\u入口服务)
{
entryService=\u entryService;
}
//获取:api/值
[HttpGet]
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
}
问题是,当我执行我的API应用程序时,它并没有击中我的构造函数,并向我显示空白页,如下所示

在不添加构造函数的情况下,应用程序运行良好

我的客户服务

公共接口IEntriesService
{
RepeatEntries-Get(int-Id);
}
我的服务

public类EntriesService:ientrieservice
{
i工作单元(u工作单元);;
公共中心服务(IUnitof work unitof work)
{
_unitOfWork=unitOfWork;
}
公共bool添加(RepeatEntries实体)
{
_unitOfWork.EntryRepository.Add(实体);
返回true;
}
}
我的工作

公共接口IUnitOfWork:IDisposable
{
IEntriesRepository EntryRepository{get;}
完全无效();
}
我的工作单位

公共类UnitOfWork:IUnitOfWork
{
私有只读客户端存储库;
公共工作单元(客户端存储入口存储库)
{
_entryRepository=entryRepository;
}
公共存储入口存储库
{
得到
{
返回_entryRepository;
}
}
void IUnitOfWork.Complete()
{
抛出新的NotImplementedException();
}
#区域IDisposable支持
private bool disposedValue=false;//用于检测冗余调用
受保护的虚拟void Dispose(bool disposing)
{
如果(!disposedValue)
{
如果(处置)
{
//TODO:处置托管状态(托管对象)。
}
//TODO:释放非托管资源(非托管对象)并覆盖下面的终结器。
//TODO:将大字段设置为null。
disposedValue=true;
}
}
//TODO:仅当上面的Dispose(bool disposing)具有释放非托管资源的代码时,才重写终结器。
//~UnitOfWork(){
////不要更改此代码。请将清理代码放入上面的Dispose(bool disposing)中。
//处置(虚假);
// }
//添加此代码是为了正确实现一次性模式。
void IDisposable.Dispose()无效
{
//不要更改此代码。请将清理代码放入上面的Dispose(bool disposing)中。
处置(真实);
//TODO:如果上面覆盖了终结器,则取消对以下行的注释。
//总干事(本);
}
#端区
}

我还需要添加什么才能使其正常工作?是否可能,或者我需要更改我的方法?

您必须向合成根注册所有依赖项,确保使用正确的生存期来注册它们,即:(
作用域
瞬态
单例
)以避免将来出现问题

public void ConfigureServices(IServiceCollection services) {
    // Add framework services.
    services.AddMvc();

    services.AddSingleton<IEntriesService, EntriesService>();
    services.AddTransient<IUnitOfWork, UnitOfWork>();
    services.AddTransient<IEntriesRepository, EntriesRepository>();
    services.AddSingleton<IConnectionFactory, ConnectionFactory>();

    //...add other dependencies. 
}
public void配置服务(IServiceCollection服务){
//添加框架服务。
services.AddMvc();
services.AddSingleton();
services.AddTransient();
services.AddTransient();
services.AddSingleton();
//…添加其他依赖项。
}
花些时间查看文档:


500是内部服务器错误。只需点击F5(从调试开始),看看有什么异常。您的方法是正确的,没有理由不工作。调试器正在访问程序和启动类,但不是控制器构造函数。和刷新显示相同的页面。如果您希望我们在不使用我们强大的算命技能的情况下帮助您,您需要提供更多信息。您只发布了控制器的内容,但您的
EntriesService
呢?我们不知道它本身是否有任何依赖项,也不知道您是否已注册这些依赖项。问题可能出在您的
Startup
类中,这就是它没有击中控制器的原因。您可以在管道的开头添加一个诊断中间件,这样每次出现未处理的异常时,您都会看到一个包含详细信息和stacktrace的异常页面。要执行此操作,请将nuget软件包添加到项目
Microsoft.AspNetCore.Diagnostics
,然后在
Startup.Configure()的开头添加
app.UseDeveloperExceptionPage()
。希望这会给你更多关于正在发生的事情的细节。你是否在某处为DI注册了IUnitOfWork?如果不是,您应该这样做,否则MVC无法构建层次结构。