‫۵ سال و ۸ ماه قبل، چهارشنبه ۱۹ دی ۱۳۹۷، ساعت ۰۴:۳۳
نکته تکمیلی
 
تکه کد داخل بدنه foreach را می‌توان با استفاده از  کتابخانه Scrutor به شکل زیر بازنویسی کرد:
services.Decorate(descriptor.ServiceType, (target, serviceProvider) =>
    proxyGenerator.CreateInterfaceProxyWithTargetInterface(descriptor.ServiceType, target,
        serviceProvider.GetService<LoggingInterceptor>()));
مطلب تکمیلی
‫۵ سال و ۸ ماه قبل، چهارشنبه ۱۹ دی ۱۳۹۷، ساعت ۰۴:۰۷
استفاده از AOP Interceptor‌ها در برنامه‌های  NET Core. با استفاده از IoC Container توکار 

اگر بخواهیم Container مثال مطلب جاری را با IoC Container توکار NET Core. تعویض کنیم به کدهای زیر خواهیم رسید:
var descriptors = services.ToList();
var proxyGenerator = new ProxyGenerator();

foreach (var descriptor in descriptors)
{
    var serviceInterfaceType = descriptor.ServiceType;
    services.Replace(ServiceDescriptor.Describe(descriptor.ServiceType,
        provider => proxyGenerator.CreateInterfaceProxyWithTargetInterface(descriptor.ServiceType,
            provider.GetInstance(descriptor),
            new LoggingInterceptor()),
        descriptor.Lifetime));
}
 با پیمایش لیست ServiceDescriptor‌های رجیستر شده در Container، به ازای تک تک سرویس‌های موجود، کار تعویض Descriptor متناظر با آن را انجام می‌دهیم. برای این منظور یک implementationFactory را با استفاده از ProxyGenerator به شکل زیر می‌توان ایجاد کرد:
 provider => proxyGenerator.CreateInterfaceProxyWithTargetInterface(descriptor.ServiceType,
            provider.GetInstance(descriptor),
            new LoggingInterceptor())
در اینجا برای مهیا کردن شی target مورد نیاز ProxyGenerator، از متد الحاقی provider.GetInstance استفاده شده است که به شکل زیر پیاده سازی شده است:
public static object GetInstance(this IServiceProvider provider, ServiceDescriptor descriptor)
{
    if (descriptor.ImplementationInstance != null)
    {
        return descriptor.ImplementationInstance;
    }

    if (descriptor.ImplementationType != null)
    {
        return provider.GetServiceOrCreateInstance(descriptor.ImplementationType);
    }

    return descriptor.ImplementationFactory(provider);
}

private static object GetServiceOrCreateInstance(this IServiceProvider provider, Type type)
{
    return ActivatorUtilities.GetServiceOrCreateInstance(provider, type);
}
در تکه کد بالا، با بررسی ‏ImplementationInstance، ‏ImplementationType و ImplementationFactory متناظر با ServiceDescriptor مورد نظر، کار دریافت یا ایجاد وهله‌ی متناظر با ServiceType انجام می‌شود.  
‫۵ سال و ۱۱ ماه قبل، چهارشنبه ۴ مهر ۱۳۹۷، ساعت ۱۸:۳۵
سلام؛ ما در پروژه هامون معمولا کار Object Mapping رو توی لایه Repository انجام نمیدیم و در لایه Service کار تبدیل Model به ViewModel رو انجام میدیم ..  
var jobViewModel = Mapper.Map<Job>(jobViewModel);
به نظرتون استفاده مستقیم از متد ProjectTo در AutoMapper در لایه ای مثل Repository کار درستیه ؟ 
روشی دیگر جهت انتقال Data Annotations از Model به ViewModel

در ASP MVC  با MetadataTypeAttribute .
 روش کار به این صورت است که کلاس ViewModel را به Attribute (MetadataType ) مزین می‌کنیم که این Attribute  در سازنده خود تایپ Model را دریافت می‌کند و همچنین  در فضای نامی زیر قرار دارد 
System.ComponentModel.DataAnnotations 
    public class Student
    {
        public int Id { get; set; }

        [Required(ErrorMessage = "نام ضروری است")]
        [Display(Name = "نام")]
        public string Name { get; set; }
    }

ViewModel
    [MetadataType(typeof(Student))]
    public class StudentViewModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

در ASP MVC Core  هم روش کار به همین صورت است بجای MetadataType از ModelMetadataType  استفاده کنید .
‫۶ سال و ۲ ماه قبل، سه‌شنبه ۲۶ تیر ۱۳۹۷، ساعت ۱۵:۵۱
به همین دلیل full text search اختراع شده؛ چون کوئری‌های '%like N'%SearchText کند هستند و از ایندکس‌ها استفاده نمی‌کنند. contains و freetext در اینجا یعنی همین '%like N'%SearchText، اینبار به صورت ایندکس شده و بسیار سریع.