简体   繁体   English

ASP.NET 核心中的循环依赖问题

[英]Problem with Circular dependency in ASP.NET Core

I have to create services for my project, that implement other services, therefore I created many Interfaces and for some services I inject the interface to use the methods, but when I tried to compile my project I become an error, this is driving me nuts, can someone please tell me what am I doing wrong?我必须为我的项目创建服务,实现其他服务,因此我创建了许多接口,对于一些服务,我注入接口以使用这些方法,但是当我尝试编译我的项目时出现错误,这让我发疯,有人可以告诉我我做错了什么吗?

the interface:界面:

   public interface IGoogleExtensions
   {
      dynamic GetEntetiesTypeorWorth(WebhookRequest request, string entetie, bool wertHohlen);
      bool HasDisplay(WebhookRequest request);
      string StringBuilder(int position, string text, string texttoinsert);

   }

The Service服务

  public class GoogleExtensionsService : IGoogleExtensions

  {
      private readonly IGoogleVitalwertResponseHelper _googleVitalwertResponseHelper;

  public GoogleExtensionsService(IGoogleVitalwertResponseHelper googleVitalwertResponseHelper)
  {
     _googleVitalwertResponseHelper = googleVitalwertResponseHelper;
  }

  public dynamic GetEntetiesTypeorWorth(WebhookRequest request, string entetie, bool wertHohlen)
  {
     var entetieType = request.QueryResult.Parameters.Fields;
     var type = TextResponses.FehlerMeldung2;
    [...]
        type = TextResponses.Alle;
     }
     return type;
  }

  public bool HasDisplay(WebhookRequest request)
  {
     string capability = request.OriginalDetectIntentRequest.Payload.Fields[ProtobufFields.Surface].StructValue.Fields[ProtobufFields.Capabilities].ToString();
     if (capability.Contains(ProtobufFields.Screen_output))
        return true;
     return false;
  }

  public string StringBuilder(int position, string text, string texttoinsert)
  {
     StringBuilder sb = new StringBuilder(text);
     sb.Insert(position, texttoinsert);
     return sb.ToString();
  }

References in Start.up Start.up 中的参考资料

     services.AddTransient<IGoogleResponseService, GoogleResponseService>();
     services.AddTransient<IGoogleService, GoogleRequestService>();
     services.AddTransient<IGoogleExtensions, GoogleExtensionsService>();
     services.AddTransient<IGoogleVitalwertResponseHelper, GoogleVitalwertResponseService>();
     services.AddTransient<IGoogleVitalwertRequest, GoogleVitalwertRequest>();
     services.AddTransient<IGoogleMenuePlanRequest, GoogleMenuePlanRequestService>();
     services.AddTransient<IGoogleMenuePlanResponseHelper, GoogleMenuePlanResponseService>();
     services.AddTransient<IGoogleMedikamentRequest, GoogleMedikamentRequestService>();
     services.AddTransient<IGoogleMedikamentResponse, GoogleMedikamentResponseService>();
     services.AddTransient<IGoogleBerichtResponse, GoogleBerichResponseService>();

I´m dealing with the following error:我正在处理以下错误:

Host terminated unexpectedly
System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: XXX.Microservices.Xxx.Api.Contract.Services.IGoogleService Lifetime: Transient ImplementationType: XXX.Microservices.Xxx.Api.Services.GoogleRequestService': A circular dependency was detected for the service of type 'XXX.Microservices.Xxx.Api.Contract.Services.IGoogleExtensions'.
XXX.Microservices.Xxx.Api.Contract.Services.IGoogleService(XXX.Microservices.Xxx.Api.Services.GoogleRequestService) -> XXX.Microservices.Xxx.Api.Contract.Services.IGoogleExtensions(XXX.Microservices.Xxx.Api.Services.GoogleExtensionsService) -> XXX.Microservices.Xxx.Api.Contract.Services.IGoogleVitalwertResponseHelper(XXX.Microservices.Xxx.Api.Services.GoogleVitalwertResponseService) -> XXX.Microservices.Xxx.Api.Contract.Services.IGoogleExtensions) (Error while validating the service descriptor 'ServiceType: XXX.Microservices.Xxx.Api.Contract.Services.IGoogleExtensions Lifetime: Transient ImplementationType: XXX.Microservices.Xxx.Api.Services.GoogleExtensionsService': A circular dependency was detected for the service of type 'XXX.Microservices.Xxx.Api.Contract.Services.IGoogleExtensions'.
XXX.Microservices.Xxx.Api.Contract.Services.IGoogleExtensions(XXX.Microservices.Xxx.Api.Services.GoogleExtensionsService) -> XXX.Microservices.Xxx.Api.Contract.Services.IGoogleVitalwertResponseHelper(XXX.Microservices.Xxx.Api.Services.GoogleVitalwertResponseService) -> XXX.Microservices.Xxx.Api.Contract.Services.IGoogleExtensions)

Edit编辑

public class GoogleVitalwertResponseService : IGoogleVitalwertResponseHelper
   {
      private readonly IGoogleResponseService _googleResponseService;
      private readonly IGoogleExtensions _googleExtensions;
      private readonly IGoogleVitalwertResponseHelper _googleVitalwertResponseHelper;

      public GoogleVitalwertResponseService(IGoogleResponseService googleResponseService, IGoogleExtensions googleExtensions, IGoogleVitalwertResponseHelper googleVitalwertResponseHelper)
      {
         _googleResponseService = googleResponseService;
         _googleExtensions = googleExtensions;
         _googleVitalwertResponseHelper = googleVitalwertResponseHelper;
      }

      public WebhookResponse VitalwertListResponse(WebhookRequest request, List<VitalwertOutput> vitalList, string vitalwertReference)
      {
         var session = new List<int>();
         var items = new List<Value>();
         int counter = 0;
         ...
      }

      public WebhookResponse VitalwertUebersicht(WebhookRequest request, ICollection<VitalwertOutput> vitalList, ICollection<VitalwertKategorie> Definitionen)
      {
         var items = new List<Value>();
         ....
         return _googleResponseService.BuildListResponse(request, items, "Ich habe " + items.Count + " Vitalwerte gefunden", 3, SessionNames.SessionVitalwertUebersicht, session, null, null, null);
      }

      public string GetAktuellTag(string tag, DayOfWeek dayname)
      {
         DateTime today = DateTime.Parse(tag);
         ...
      }

      public List<KeyValuePair<string, int>> GenerateImageLinks()
      {
         var list = new List<KeyValuePair<string, int>>();
         list.Add(new KeyValuePair<string, int>(ImagesURLS.Stethoscope, 1));
         return list;
      }

      public string GenerateLink(List<KeyValuePair<string, int>> list, int DefinitionId)
     ...
         var sub = vitalart.Substring(1, vitalart.Length - 2);
         return sub;
      }

Your GoogleExtensionsService uses GoogleVitalwertResponseService which uses GoogleExtensionsService , etc, etc. Your concrete implementations cannot have circular dependencies.您的GoogleExtensionsService使用GoogleVitalwertResponseService ,它使用GoogleExtensionsService等。您的具体实现不能有循环依赖。

It looks like GoogleExtensionsService gets GoogleVitalwertResponseService injected, but doesn't actually use it.看起来GoogleExtensionsService注入了GoogleVitalwertResponseService ,但实际上并没有使用它。 Remove that reference from the GoogleExtensionsService and you should be set.GoogleExtensionsService中删除该引用,您应该已设置好。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM