بهترین ها همه در یک جا
برای اضافه کردن یک سری قابلیت ها نظیر Scan کردن اسمبلی و یا Decoration به Microsoft.Extensions.DependencyInjection موجود یک Extension Method با نام Scrutor طراحی شده است که توسط آن میتونید یک سری قابلیت های بیشتر داشته باشید و به طور مثال برای Scan کردن یک Assembly برای اتومات کردن تعریف سرویس ها در Startup برنامه، نیاز به یک DI Container جدید نداشته باشید و با DI Container پیش فرض که Built In هست نیاز های پروژه رو برطرف کنید و از طرفی با این کار تا حد زیادی مشکل فراموشی تعریف کردن سرویس ها در DI Container حل میشه و از ارورهای آتی پیشگیری میشه.
برای نصب کافیه اون رو از نیوگت دریافت کنید.
Install-Package Scrutor
سپس برای استفاده در dotnet core 5 وارد فایل startup و در dot net 6 وارد فایل program بشید و در قسمت تعریف سرویس ها به عنوان مثال از کدی شبیه کد زیر استفاده کنید.
builder.Services.Scan(scan => scan.FromAssemblyOf<UserService>()
.AddClasses(c => c.InExactNamespaceOf<UserService>())
.AsSelf()
.AsImplementedInterfaces().WithScopedLifetime()
.FromAssemblyOf<SmsService>()
.AddClasses(c => c.InExactNamespaceOf<SmsService>())
.AsSelf()
.AsImplementedInterfaces().WithScopedLifetime()
);
نکته اول : در هنگام اضافه کردن AddClasses نام یکی از سرویس هایی که در NameSpace مورد نظر وجود دارد را انتخاب کنید ، تا به صورت اتومات برای سایرین نیز توسط Reflection انتخاب شود.
نکته دوم : AsSelf برای سرویس هایی است که بدون interface میخواهیم آنها را inject کنیم.
نکته سوم : میشه چندین نوع سرویس رو در داخل Scan پشت سر هم رجیستر کرد . ( برای مثال در اینجا UserService در یک NameSpace و اسمبلی جدا و SmsService در یک NameSpaceو اسمبلی دیگر است ) همچنین میشه به آنها LifeCycle های مختلفی اعمال کرد.
آدرس صفحه گیت پروژه : https://github.com/khellang/Scrutor