این خطا ممکن است در هر حالتی یا سناریویی رخ دهد و وابسته به راه حل جاری نیست. به این معنا است که کلاس A از اینترفیس تزریق شده‌ی کلاس B استفاده می‌کند و کلاس B از اینترفیس تزریق شده‌ی کلاس A استفاده می‌کند. این نوع طراحی یک ارجاع حلقوی را ایجاد می‌کند. راه حل آن این است که موارد مشترک را در یک کلاس C قرار دهید و اینترفیس آن‌را در دو کلاس B و A تزریق کنید تا دیگر این دو کلاس ارجاع دو طرفه‌ای به هم نداشته باشند.
در حین استفاده از این نکته با خطای زیر برخورد کردم، لطفا راهنمایی بفرمایید:
Bi-directional dependency relationship detected!
البته وابستگی هایی که تزریق میشوند کلاسهای uow و اینترفیس‌های business لازم برای کنترلرAPI هستند. که تنها وجه مشترک این Web API با بقیه استفاده از uow برای DbContext است.
‫۹ سال و ۸ ماه قبل، جمعه ۱۷ بهمن ۱۳۹۳، ساعت ۰۳:۲۹
- بله. چون در تعریف قبلی آن، متد Set در کلاس پایه DbContext از قبل موجود بود و پیاده سازی شده بود. به همین جهت نیازی به پیاده سازی مجدد آن نبود. بدیهی است هر تعریف جدید دیگری را که اضافه کنید، خودتان هم باید مطابق معمول روال کار با اینترفیس‌ها، پیاده سازی آن‌را به کلاس Context خودتان اضافه کنید.
- ضمنا در اینجا Lazy تعریف کردن یک Set غیرضروری است. این Set فقط به یک جدول از بانک اطلاعاتی اشاره می‌کند و جزئی از کوئری LINQ نوشته شده خواهد بود. اگر قرار است چیزی را Lazy تعریف کنید، Lazy<IUnitOfWork> uow در سازنده‌ی یک کلاس خواهد بود. کل شیء و نه یک خاصیت از آن. زمانیکه Uow وهله سازی می‌شود، تمام Setهای آن در دسترس هستند و Lazy تعریف کردن آن‌ها در اینجا فایده‌ای ندارد.
- همچنین EF برای Setها مباحث Lazy loading خاص خودش را دارد و از این بحث جدا است.
‫۹ سال و ۸ ماه قبل، جمعه ۱۷ بهمن ۱۳۹۳، ساعت ۰۳:۱۹
در حالت lazy 
public interface IUnitOfWork
{
    Lazy<IDbSet<TEntity>> LazySet<TEntity>() where TEntity : class; 
    int SaveChanges(); 
}
در کلاس context که از کلاس IUnitOfWork  ارث بری کرده پیاده سازی متد
Lazy <IDbSet<TEntity>> LazySet<TEntity>()  where  TEntity :  class
ایراد می‌دهد.
‫۹ سال و ۸ ماه قبل، جمعه ۱۷ بهمن ۱۳۹۳، ساعت ۰۲:۲۰
- بله. StructureMap 3.x بدون مشکل با سازنده‌های Lazy کار می‌کند و نیازی به تنظیمات اضافه‌تری ندارد.
- اگر uow در تمام متدهای کلاس جاری استفاده می‌شود، نیازی نیست Lazy تعریف شود. اگر خیر، روش دومی که نوشتید، در صورت نیاز سبب وهله سازی آن خواهد شد. مورد تنظیم شده در سازنده، عملا تفاوتی با حالت معمولی ندارد؛ چون بلافاصله سبب وهله سازی آن می‌شود (اولین تماس با خاصیت Value، آن‌را وهله سازی می‌کند).
‫۹ سال و ۸ ماه قبل، جمعه ۱۷ بهمن ۱۳۹۳، ساعت ۰۱:۰۳
اینطور که شما می‌فرمایید ، می‌توان نتیجه گرفت که کدهای این بخش فرقی با حالت غیر Lazy ندارد و روال مثل گذشته است و تنها تفاوت در کلاس‌های سرویس می‌باشد.
(البته طبق فایل معرفی شده در گیت هاب ، گویا در بخش ابتدایی کلاس SmObjectFactory تغییراتی داریم)

سوالی که پیش میاد اینه که اگر نیاز باشه در یک کلاس خود کلاس کانتکس رو Lazy کنیم ، آیا کدنویسی بصورت زیر درون کلاس سرویس درست است :

private readonly Lazy<IUnitOfWork> _uow;
private readonly IDbSet<JobCategory> _jobCategories;
public JobCategoryService(Lazy<IUnitOfWork> uow)
{
     _uow = uow;
     _jobCategories = _uow.Value.Set<JobCategory>();
}

یا اینکه کد زیر را باید در متدی که مورد نیاز است بنویسیم ؟
_jobCategories = _uow.Value.Set<JobCategory>();

طبق فرمایشات شما به نظرم روش اول نادرست باشه ؛ درسته ؟
‫۹ سال و ۸ ماه قبل، پنجشنبه ۱۶ بهمن ۱۳۹۳، ساعت ۲۳:۳۳
- آیا وابستگی تزریق شده، در تمام متدهای آن کلاس استفاده می‌شود؟ اگر بله، خیر؛ نیازی نیست. اگر خیر، «بهتر است» به صورت lazy تعریف شود.
- بله. کمی بالاتر پاسخ دادم. مثال کامل آن برای اجرا و بررسی بیشتر.
‫۹ سال و ۸ ماه قبل، پنجشنبه ۱۶ بهمن ۱۳۹۳، ساعت ۲۳:۲۳
با سلام،
بنده در لایه سرویس در کد زیر به مشکل خوردم :
public class JobSubCategoryService : IJobSubCategoryService
{ 
       private readonly Lazy<IUnitOfWork> _uow;
        private readonly Lazy<IDbSet<JobSubCategory>> _jobSubCategories;
        public JobSubCategoryService(Lazy<IUnitOfWork> uow)
        {
            _uow = uow;
            _jobSubCategories = uow.Value.Set<JobSubCategory>();  // i have problem here
        }
    
    // some methods here ...
}
  • سوال بنده اینه که آیا لازمه خود کانتکست رو هم بصورت Lazy نماییم ؟
  • سوال دوم بنده این است که آیا در حالت Lazy روشی برای خودکار کردن معرفی کلاس‌ها و اینترفیس‌ها به استراکچر مپ وجود دارد (شما در پایان مقاله جاری بصورت دستی معرفی نموده اید ...)؟
‫۹ سال و ۸ ماه قبل، سه‌شنبه ۱۴ بهمن ۱۳۹۳، ساعت ۱۶:۰۹
در مثال فوق، تنظیمات دستی را حذف کنید و آن‌را تبدیل کنید به :
x.Scan(scanner =>
{
    scanner.AssemblyContainingType<IOrderHandler>();
 
    // connects `IAccounting` to `Accounting` and `ISales` to `Sales` automatically.
    scanner.WithDefaultConventions();
});
مثال کامل