• 1400/01/19
  • 0
  • 492
1400/01/19 |
backend

خطای 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 است البته من اینطور فکر میکنم

استاد گرامی اگر نظری دارید و یا سایر دوستان اگر نظری دارند لطف کنند راهنمایی کنند

ممنون


سلام

احتمالا در پیاده سازی Facad از یک سرویسی استفاده کرده اید که آن سرویس در ioc ثبت نشده است لطفا این مورد را هم بررسی  نمایید


سلام

در پیاده سازی از هیچ سرویسی استفاده نکردم و هز facad ذیگری را نیز جای این برای تست استفاده کردم خطا را روی همان facad نمایش میدهد

 


کد پیاده سازی انترفیس

IStatisticsFacad

 را ارسال کنید که بررسی کنم


ممنون از شما

پاسخ را پیدا کردم

زمانی که یک 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)

 

 



پاسخی برای این باگ ارسال کنید

لطفا کدها را درون قطعه کد ارسال نمایید

برای ارسال پاسخ باید وارد حساب کاربری خود شوید
ورود به حساب کاربری