- 1400/01/19
- 0
- 495
خطای Cannot resolve scoped service 'Application.Interfaces.FacadPattern.IStatisticsFacad' from root provider
با سلام خدمت دوستان و استاد گرامی آقای بابایی
مشکلی که بنده در برنامه دارم برخورد با خطای "Cannot resolve scoped service 'AsgariCarStore.Application.Interfaces.FacadPattern.IStatisticsFacad' from root provider" است
یک آمارگیر برای سایت مینویسم که کاربران آنلاین و تعداد بازدیدها را نمایش دهد
کاربران آنلاین را انجام دادم ولی برای ثبت بازدیدها نیاز به ثبت در دیتا بیس است که از سرویسها و Facad استفاده میکنم و در سایر قسمتهای برنامه هیچگونه مشکلی ندارم
فقط در این قسمت از برنامه موقع اجرا خطای فوق نمایش داده میشود
این تعریف facad و سرویسهای مورد نظر
public interface IStatisticsFacad
{
/// <summary>
/// اضافه کردن رکورد روز جهت شمارش
/// </summary>
AddStatesticsService AddStatesticsService { get; }
/// <summary>
/// اضافه کردن کاربر به سیستم
/// </summary>
AddStUserService AddStUserService { get; }
/// <summary>
/// اضافه کردن مراجعات کاربر به سیستم
/// </summary>
AddStatesticsDetailService AddStatesticsDetailService { get; }
}
این قسمتی که در startup اضافه شده
services.AddScoped<IUserFacad, UserFacad>();
services.AddScoped<IUtilityFacad, UtilityFacad>();
services.AddScoped<IProductFacad, ProductFacad>();
services.AddScoped<ISiteFacad, SiteFacad>();
services.AddScoped<IStatisticsFacad, StatisticsFacad>();
و در قسمت دیگر
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
//هر درخواستی به سمت سرور آمد یک کانتر برای افراد آنلاین ساخته میشود
app.UseMiddleware<ApplicationVariable>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "areas",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
و این هم فراخوانی و تزریق وابستگی در برنامه مورد نظر
public class ApplicationVariable
{
private readonly RequestDelegate _next;
private static int TimeOut = 5;
private readonly IStatisticsFacad _statisticFacad;
public ApplicationVariable(RequestDelegate next
, IStatisticsFacad statisticFacad
)
{
_next = next;
_statisticFacad = statisticFacad;
}
public async Task Invoke(HttpContext httpContext)
{
string UserAgent = httpContext.Request.Headers["User-Agent"].ToString();
string refer = httpContext.Request.Headers["Referer"].ToString();
if (UserAgent == null)
await _next.Invoke(httpContext);
خودم احتمال میدهم که این قسمت جلوتر از فراخوانی سرویسها اجرا میشود و برای این قسمت هنوز دیتابیس و سرویسها شناسایی نمیشوند و این خطا رخ میدهد
اگر در همین کلاس خط های مربوط به تزریق وابستگی Facad مورد نط را کامنت کنم و به سرویسهای فراخوانی شده را نیز کامنت کنم برنامه راحت اجرا میشود
و اگر در قسمتهای معمولی این facad را اضافه کنم باز هم اجرا میشود یعنی سرویسها و اینترفیس مشکلی ندارد و مشکل از زودتر اجرا شدن یا فراخوانی Facad است البته من اینطور فکر میکنم
استاد گرامی اگر نظری دارید و یا سایر دوستان اگر نظری دارند لطف کنند راهنمایی کنند
ممنون
- 1400/01/19
سلام
احتمالا در پیاده سازی Facad از یک سرویسی استفاده کرده اید که آن سرویس در ioc ثبت نشده است لطفا این مورد را هم بررسی نمایید
- 1400/01/19
سلام
در پیاده سازی از هیچ سرویسی استفاده نکردم و هز facad ذیگری را نیز جای این برای تست استفاده کردم خطا را روی همان facad نمایش میدهد
- 1400/01/19
کد پیاده سازی انترفیس
IStatisticsFacad
را ارسال کنید که بررسی کنم
- 1400/01/20
ممنون از شما
پاسخ را پیدا کردم
زمانی که یک middleware ایجاد میکنیم در آن نباید از تزریق وابستگی استفاده کنیم
باید همان Facad را بصورت پارامتر به متد ارسال کنیم
این قسمت از کد را
private readonly IStatisticsFacad _statisticFacad;
public ApplicationVariable(RequestDelegate next
, IStatisticsFacad statisticFacad
)
{
_next = next;
_statisticFacad = statisticFacad;
}
public async Task Invoke(HttpContext httpContext)
به این شیوه عوض کردم و درست شد
public ApplicationVariable(RequestDelegate next
)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext, IStatisticFacad _StatisticFacad)
پاسخی برای این باگ ارسال کنید
لطفا کدها را درون قطعه کد ارسال نمایید
برای ارسال پاسخ باید وارد حساب کاربری خود شوید
ورود به حساب کاربری