示例#1
0
        /// <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);
        }
示例#2
0
        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);
        }