public override void Run(ServiceProviderContainer container, Assembly[] assemblies, CrudlessOptions options) { var universalProfiles = assemblies .SelectMany(x => x.GetExportedTypes()) .Where(x => !x.IsAbstract && x.BaseType != null && x.BaseType.IsGenericType && x.BaseType.GetGenericTypeDefinition() == typeof(UniversalRequestProfile <>)) .ToArray(); bool ShouldDecorate(DecoratorConditionalContext context) { var tRequest = context.ServiceType.GetGenericArguments()[0]; foreach (var type in tRequest.BuildTypeHierarchyUp()) { if (type.GetInterface(typeof(ICrudlessRequest).Name) != null) { return(false); } if (universalProfiles.Any(x => x.BaseType.GetGenericArguments()[0] == type)) { return(true); } } return(false); } container.RegisterDecorator(typeof(IRequestHandler <>), typeof(UniversalRequestDecorator <>), ShouldDecorate); container.RegisterDecorator(typeof(IRequestHandler <,>), typeof(UniversalRequestDecorator <,>), ShouldDecorate); }
public override void Run(ServiceProviderContainer container, Assembly[] assemblies, CrudlessOptions options) { var shouldValidate = ShouldValidate(options.ValidateAllRequests); var shouldMaybeValidate = ShouldMaybeValidate(options.ValidateAllRequests); container.Register(typeof(IRequestValidator <>), assemblies); container.RegisterInstance(new ValidatorFactory(container)); container.RegisterDecorator(typeof(IRequestHandler <>), ValidatorFactory, shouldValidate); container.RegisterDecorator(typeof(IRequestHandler <,>), ValidatorFactory, shouldValidate); container.RegisterDecorator(typeof(IRequestHandler <>), typeof(MaybeValidateDecorator <>), shouldMaybeValidate); container.RegisterDecorator(typeof(IRequestHandler <,>), typeof(MaybeValidateDecorator <,>), shouldMaybeValidate); }
public override void Run(ServiceProviderContainer container, Assembly[] assemblies, CrudlessOptions options) { switch (_transactionType) { default: case TransactionType.TransactionScope: container.RegisterDecorator(typeof(IRequestHandler <>), typeof(TransactionScopeTransactionDecorator <>), ShouldDecorate()); container.RegisterDecorator(typeof(IRequestHandler <,>), typeof(TransactionScopeTransactionDecorator <,>), ShouldDecorate()); break; case TransactionType.EntityFramework: container.RegisterDecorator(typeof(IRequestHandler <>), typeof(EntityFrameworkTransactionDecorator <>), ShouldDecorate()); container.RegisterDecorator(typeof(IRequestHandler <,>), typeof(EntityFrameworkTransactionDecorator <,>), ShouldDecorate()); break; } }