/// <summary> /// Регистрация сборок в DryIoc-контейнере /// </summary> /// <param name="services">Коллекция сервисов</param> /// <param name="assemblies">Список сборок</param> /// <returns>IContainer</returns> protected IContainer ConfigureDependencies(IServiceCollection services, params string[] assemblies) { // Register assemblies IEnumerable <AssemblyName> assemblyNames = Assembly.GetEntryAssembly() .GetReferencedAssemblies() .Where(a => assemblies.Length == 0 || assemblies.Contains(a.Name)) .ToList(); IList <Assembly> implTypeAssemblies = new List <Assembly>(assemblyNames.Count()); foreach (AssemblyName an in assemblyNames) { implTypeAssemblies.Add(Assembly.Load(an)); } IContainer container = new Container().WithDependencyInjectionAdapter(services); container.RegisterMany(implTypeAssemblies, (registrator, types, type) => { IgnoreRegistrationAttribute ignoreAttr = (IgnoreRegistrationAttribute)type.GetCustomAttribute(typeof(IgnoreRegistrationAttribute)); if (ignoreAttr == null) { // all dispatchers --> Reuse.InCurrentScope IReuse reuse = type.IsAssignableTo(typeof(ICommandDispatcher)) || type.IsAssignableTo(typeof(IJobDispatcher)) || type.IsAssignableTo(typeof(IQueryDispatcher)) ? Reuse.InCurrentScope : Reuse.Transient; registrator.RegisterMany(types, type, reuse); // interceptors if (type.IsClass) { InterceptedObjectAttribute attr = (InterceptedObjectAttribute)type.GetCustomAttribute(typeof(InterceptedObjectAttribute)); if (attr != null) { Type serviceType = attr.ServiceInterfaceType ?? type.GetImplementedInterfaces().FirstOrDefault(); registrator.RegisterInterfaceInterceptor(serviceType, attr.InterceptorType); } } } }); return(container); }
public void Configuration(IAppBuilder appBuilder) { // Set up server configuration HttpConfiguration config = new HttpConfiguration(); // DscQRouteHandler config.MessageHandlers.Add(new DscQRouteHandler()); config.MapODataServiceRoute( routeName: "DscQuery", routePrefix: "{datasource}/{path}/odata", model: GetQueryEdmModel()); #region DI Container = new Container(rules => rules.WithoutThrowOnRegisteringDisposableTransient()).WithWebApi(config); Container.RegisterMany(new [] { GetType().Assembly }, (registrator, types, type) => { Type[] interfaces = type.GetInterfaces(); bool assignedFromDispatcher = interfaces.Any(i => i.IsAssignableTo(typeof(IJobDispatcher)) || i.IsAssignableTo(typeof(IQueryDispatcher))); if (assignedFromDispatcher || interfaces.Any(i => i.IsAssignableTo(typeof(IInterceptor)) || i.IsAssignableTo(typeof(IJob)) || i.IsAssignableTo(typeof(IQuery)) || (i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IQueryHandler <,>)))) { // all dispatchers --> Reuse.InCurrentScope IReuse reuse = assignedFromDispatcher ? Reuse.InResolutionScope : Reuse.Transient; registrator.RegisterMany(types, type, reuse); // interceptors if (type.IsClass) { InterceptedObjectAttribute attr = (InterceptedObjectAttribute)type.GetCustomAttribute(typeof(InterceptedObjectAttribute)); if (attr != null) { Type serviceType = attr.ServiceInterfaceType ?? type.GetImplementedInterfaces().FirstOrDefault(); registrator.Intercept(serviceType, attr.InterceptorType); } } } }); Container.RegisterInstance((IOracleEnvironmentConfiguration)System.Configuration.ConfigurationManager.GetSection("oracleEnvironment")); Container.RegisterInstance(System.Configuration.ConfigurationManager.AppSettings["ProviderName"], serviceKey: "ProviderName"); Container.Register( reuse: Reuse.InResolutionScope, made: Made.Of(() => DbManagerFactory.CreateDbManager(Arg.Of <string>("ProviderName"), null), requestIgnored => string.Empty) ); // IDbManager initialiazation Container.RegisterInitializer <IDbManager>((m, r) => m.Log = Log.Logger.Debug); // cache manager Container.Register(reuse: Reuse.Singleton, made: Made.Of(() => CacheFactory.FromConfiguration <object>("webCache"))); Container.UseInstance(Container); #endregion // Startup Jobs IJobDispatcher dispatcher = Container.Resolve <IJobDispatcher>(IfUnresolved.ReturnDefault); dispatcher?.Dispatch <IStartupJob>(); config.Filters.Add(new GlobalExceptionFilter()); var odataFormatters = ODataMediaTypeFormatters.Create(new SkipNullValueODataSerializerProvider(), new DefaultODataDeserializerProvider()); config.Formatters.InsertRange(0, odataFormatters); appBuilder.UseWebApi(config); }