/// <summary> /// Register dependencies /// </summary> /// <param name="services">Collection of service descriptors</param> /// <param name="appSettings">App settings</param> public virtual void RegisterDependencies(IServiceCollection services, AppSettings appSettings) { var typeFinder = new WebAppTypeFinder(); //register engine services.AddSingleton <IEngine>(this); //register type finder services.AddSingleton <ITypeFinder>(typeFinder); //find dependency registrars provided by other assemblies var dependencyRegistrars = typeFinder.FindClassesOfType <IDependencyRegistrar>(); //create and sort instances of dependency registrars var instances = dependencyRegistrars .Select(dependencyRegistrar => (IDependencyRegistrar)Activator.CreateInstance(dependencyRegistrar)) .OrderBy(dependencyRegistrar => dependencyRegistrar.Order); //register all provided dependencies foreach (var dependencyRegistrar in instances) { dependencyRegistrar.Register(services, typeFinder, appSettings); } services.AddSingleton(services); }
/// <summary> /// Register mapping /// </summary> /// <param name="config">Config</param> protected virtual void RegisterMapperConfiguration(NopConfig config) { //dependencies var typeFinder = new WebAppTypeFinder(); //register mapper configurations provided by other assemblies var mcTypes = typeFinder.FindClassesOfType <IMapperConfiguration>(); var mcInstances = new List <IMapperConfiguration>(); foreach (var mcType in mcTypes) { mcInstances.Add((IMapperConfiguration)Activator.CreateInstance(mcType)); } //sort mcInstances = mcInstances.AsQueryable().OrderBy(t => t.Order).ToList(); //get configurations var configurationActions = new List <Action <IMapperConfigurationExpression> >(); foreach (var mc in mcInstances) { configurationActions.Add(mc.GetConfiguration()); } //register AutoMapperConfiguration.Init(configurationActions); }
/// <summary> /// Add and configure services /// </summary> /// <param name="services">Collection of service descriptors</param> /// <param name="configuration">Configuration of the application</param> public void ConfigureServices(IServiceCollection services, IConfiguration configuration) { //find startup configurations provided by other assemblies var typeFinder = new WebAppTypeFinder(); var startupConfigurations = typeFinder.FindClassesOfType <INopStartup>(); //create and sort instances of startup configurations var instances = startupConfigurations .Select(startup => (INopStartup)Activator.CreateInstance(startup)) .OrderBy(startup => startup.Order); //configure services foreach (var instance in instances) { instance.ConfigureServices(services, configuration); } //register mapper configurations AddAutoMapper(services, typeFinder); //run startup tasks RunStartupTasks(typeFinder); //resolve assemblies here. otherwise, plugins can throw an exception when rendering views AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; }
public void Initialize() { var builder = new ContainerBuilder(); var typeFinder = new WebAppTypeFinder(); //containerManager.Resolve<ITypeFinder>(); Action <ContainerBuilder> action = (x => { var drTypes = typeFinder.FindClassesOfType <IDependencyRegistrar>(); var drInstances = new List <IDependencyRegistrar>(); foreach (var drType in drTypes) { drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType)); } //sort drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); foreach (var dependencyRegistrar in drInstances) { dependencyRegistrar.Register(x, typeFinder); } }); action.Invoke(builder); container = builder.Build(); System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //设置mvc的依赖对象 }
/// <summary> /// Register dependencies /// </summary> /// <param name="config">Config</param> protected virtual void RegisterDependencies(NopConfig config) { var builder = new ContainerBuilder(); //dependencies var typeFinder = new WebAppTypeFinder(); //不使用NopConfig来进行配置,注释 //builder.RegisterInstance(config).As<NopConfig>().SingleInstance(); builder.RegisterInstance(this).As <IEngine>().SingleInstance(); builder.RegisterInstance(typeFinder).As <ITypeFinder>().SingleInstance(); //register dependencies provided by other assemblies var drTypes = typeFinder.FindClassesOfType <IDependencyRegistrar>(); var drInstances = new List <IDependencyRegistrar>(); foreach (var drType in drTypes) { drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType)); } //sort drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); foreach (var dependencyRegistrar in drInstances) { dependencyRegistrar.Register(builder, typeFinder, config); } var container = builder.Build(); this._containerManager = new ContainerManager(container); //set dependency resolver DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); }
/// <summary> /// Add and configure services /// </summary> /// <param name="services">Collection of service descriptors</param> /// <param name="configuration">Configuration root of the application</param> /// <returns>Service provider</returns> public IServiceProvider ConfigureServices(IServiceCollection services, IConfigurationRoot configuration) { //find startup configurations provided by other assemblies var typeFinder = new WebAppTypeFinder(); var startupConfigurations = typeFinder.FindClassesOfType <INopStartup>(); //create and sort instances of startup configurations var instances = startupConfigurations .Where(startup => PluginManager.FindPlugin(startup)?.Installed ?? true) //ignore not installed plugins .Select(startup => (INopStartup)Activator.CreateInstance(startup)) .OrderBy(startup => startup.Order); //configure services foreach (var instance in instances) { instance.ConfigureServices(services, configuration); } //register mapper configurations AddAutoMapper(services, typeFinder); //register dependencies var nopConfig = services.BuildServiceProvider().GetService <NopConfig>(); RegisterDependencies(nopConfig, services, typeFinder); //run startup tasks if (!nopConfig.IgnoreStartupTasks) { RunStartupTasks(typeFinder); } //resolve assemblies here. otherwise, plugins can throw an exception when rendering views AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; //set App_Data path as base data directory (required to create and save SQL Server Compact database file in App_Data folder) var fileProvider = Resolve <INopFileProvider>(); AppDomain.CurrentDomain.SetData("DataDirectory", fileProvider.MapPath("~/App_Data/")); return(_serviceProvider); }
/// <summary> /// Add and configure services /// </summary> /// <param name="services">Collection of service descriptors</param> /// <param name="configuration">Configuration of the application</param> /// <returns>Service provider</returns> public IServiceProvider ConfigureServices(IServiceCollection services, IConfiguration configuration) { //find startup configurations provided by other assemblies var typeFinder = new WebAppTypeFinder(); var startupConfigurations = typeFinder.FindClassesOfType <INopStartup>(); //create and sort instances of startup configurations var instances = startupConfigurations //.Where(startup => PluginManager.FindPlugin(startup)?.Installed ?? true) //ignore not installed plugins .Select(startup => (INopStartup)Activator.CreateInstance(startup)) .OrderBy(startup => startup.Order); //configure services foreach (var instance in instances) { instance.ConfigureServices(services, configuration); } //register mapper configurations AddAutoMapper(services, typeFinder); // CAHNGED //register dependencies var nopConfig = services.BuildServiceProvider().GetService <NopConfig>(); //RegisterDependencies(nopConfig, services, typeFinder); RegisterServices(nopConfig, services, typeFinder); //run startup tasks if (!nopConfig.IgnoreStartupTasks) { RunStartupTasks(typeFinder); } //resolve assemblies here. otherwise, plugins can throw an exception when rendering views AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; return(_serviceProvider); }
/// <summary> /// Register dependencies /// </summary> /// <param name="config">Config</param> protected virtual void RegisterDependencies(NopConfig config) { var builder = new ContainerBuilder(); var container = builder.Build(); this._containerManager = new ContainerManager(container); //we create new instance of ContainerBuilder //because Build() or Update() method can only be called once on a ContainerBuilder. //dependencies var typeFinder = new WebAppTypeFinder(); builder = new ContainerBuilder(); builder.RegisterInstance(config).As <NopConfig>().SingleInstance(); builder.RegisterInstance(this).As <IEngine>().SingleInstance(); builder.RegisterInstance(typeFinder).As <ITypeFinder>().SingleInstance(); builder.Update(container); //register dependencies provided by other assemblies builder = new ContainerBuilder(); var drTypes = typeFinder.FindClassesOfType <IDependencyRegister>(); var drInstances = new List <IDependencyRegister>(); foreach (var startUpTaskType in drTypes) { drInstances.Add((IDependencyRegister)Activator.CreateInstance(startUpTaskType)); } drInstances.AsQueryable().OrderBy(st => st.Order).ToList(); foreach (var dependencyRegister in drInstances) { dependencyRegister.Register(builder, typeFinder, config); } builder.Update(container); //set dependency resolver DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); }
/// <summary> /// Add and configure services /// 添加和配置服务 /// </summary> /// <param name="services">Collection of service descriptors</param> /// <param name="configuration">Configuration of the application</param> /// <param name="nopConfig">Nop configuration parameters</param> /// <returns>Service provider</returns> public IServiceProvider ConfigureServices(IServiceCollection services, IConfiguration configuration, NopConfig nopConfig) { //find startup configurations provided by other assemblies //查找其他程序集提供的启动配置 var typeFinder = new WebAppTypeFinder(); var startupConfigurations = typeFinder.FindClassesOfType <INopStartup>(); //create and sort instances of startup configurations //创建并排序启动配置实例 var instances = startupConfigurations .Select(startup => (INopStartup)Activator.CreateInstance(startup)) .OrderBy(startup => startup.Order); //configure services //配置服务 foreach (var instance in instances) { instance.ConfigureServices(services, configuration); } //register mapper configurations //添加AutoMapper映射 AddAutoMapper(services, typeFinder); //register dependencies //注册依赖项 RegisterDependencies(services, typeFinder, nopConfig); //run startup tasks //运行启动任务 RunStartupTasks(typeFinder); //resolve assemblies here. otherwise, plugins can throw an exception when rendering views //解决程序集。否则,插件在呈现视图时可能引发异常 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; return(_serviceProvider); }
/// <summary> /// Register dependencies /// </summary> /// <param name="config">Config</param> protected virtual void RegisterDependencies(NopConfig config) { var builder = new ContainerBuilder(); //dependencies var typeFinder = new WebAppTypeFinder(); //builder.RegisterInstance(config).As<NopConfig>().SingleInstance(); builder.RegisterInstance(this).As <IEngine>().SingleInstance(); builder.RegisterInstance(typeFinder).As <ITypeFinder>().SingleInstance(); //register dependencies provided by other assemblies var drTypes = typeFinder.FindClassesOfType <IDependencyRegistrar>(); var drInstances = new List <IDependencyRegistrar>(); foreach (var drType in drTypes) { drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType)); } //sort drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); foreach (var dependencyRegistrar in drInstances) { dependencyRegistrar.Register(builder, typeFinder, config); } //dependencies //var typeFinder = new WebAppTypeFinder(); //==================================================================== //register mapper configurations provided by other assemblies var mcTypes = typeFinder.FindClassesOfType <IMapperConfiguration>(); var mcInstances = new List <IMapperConfiguration>(); foreach (var mcType in mcTypes) { mcInstances.Add((IMapperConfiguration)Activator.CreateInstance(mcType)); } //sort mcInstances = mcInstances.AsQueryable().OrderBy(t => t.Order).ToList(); //get configurations var configurationActions = new List <Action <IMapperConfigurationExpression> >(); foreach (var mc in mcInstances) { configurationActions.Add(mc.GetConfiguration()); } //register AutoMapperConfiguration.Init(configurationActions); builder.Register(c => AutoMapperConfiguration.Mapper).SingleInstance(); builder.Register(c => AutoMapperConfiguration.MapperConfiguration).SingleInstance(); //==================================================================== var container = builder.Build(); this._containerManager = new ContainerManager(container); //set dependency resolver DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); }
/// <summary> /// Register dependencies /// 注册依赖(基于Autofac依赖注入框架) /// </summary> /// <param name="config">Config</param> protected virtual void RegisterDependencies(NopConfig config) { /* * 1、ContainerBuilder:组件通过它来进行注册。 * 2、组件,对象需要从组件中来获取。 * 3、哪些元素可以作为组件:Lambda表达式,一个类型,一个预编译的实例,实例类型所在的程序集。 * 4、容器:ContainerBuilder的Build()方法可以创建容器,从容器的Resolve()方法能够获得对象。 * 5、为指定组件服务是某一接口:As()方法将用于注册时指定。 * 6、组件的依赖关系:组件的依赖关系主要通过接口实现。 */ //创建组件容器 var builder = new ContainerBuilder(); //注册依赖 //dependencies var typeFinder = new WebAppTypeFinder(); //注册对象实例,并指定作为单例使用。 builder.RegisterInstance(config).As <NopConfig>().SingleInstance(); //Nop配置 builder.RegisterInstance(this).As <IEngine>().SingleInstance(); //引擎 builder.RegisterInstance(typeFinder).As <ITypeFinder>().SingleInstance(); //类型发现器 //register dependencies provided by other assemblies //查找所有依赖注册具体实现类。然后实例化他们。调用他们的依赖注册方法。 var drTypes = typeFinder.FindClassesOfType <IDependencyRegistrar>(); var drInstances = new List <IDependencyRegistrar>(); foreach (var drType in drTypes) { drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType)); } //sort //排序 drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); foreach (var dependencyRegistrar in drInstances) { //执行依赖注册 dependencyRegistrar.Register(builder, typeFinder, config); } var container = builder.Build(); this._containerManager = new ContainerManager(container); //set dependency resolver // ??? //使用指定的依赖关系解析程序接口,为依赖关系解析程序提供一个注册点。 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //DependencyResolver //为实现 IDependencyResolver 或常用服务定位器 IServiceLocator 接口的依赖关系解析程序提供一个注册点。 //Autofac.Integration.WebApi; //// Set the dependency resolver for Web API. //var webApiResolver = new AutofacWebApiDependencyResolver(container); //GlobalConfiguration.Configuration.DependencyResolver = webApiResolver; //// Set the dependency resolver for MVC. //var resolver = new AutofacDependencyResolver(container); //DependencyResolver.SetResolver(resolver); }
/// <summary> /// Register dependencies /// </summary> /// <param name="config">Config</param> protected virtual void RegisterDependencies() { #region Autofac 3.5版 /* * var builder = new ContainerBuilder(); * var container = builder.Build(); * this._containerManager = new ContainerManager(container); * * //we create new instance of ContainerBuilder * //because Build() or Update() method can only be called once on a ContainerBuilder. * * //dependencies * var typeFinder = new WebAppTypeFinder(); * builder = new ContainerBuilder(); * //builder.RegisterInstance(config).As<ScdConfig>().SingleInstance(); * builder.RegisterInstance(this).As<IEngine>().SingleInstance(); * builder.RegisterInstance(typeFinder).As<ITypeFinder>().SingleInstance(); * builder.Update(container); * * //register dependencies provided by other assemblies * builder = new ContainerBuilder(); * var drTypes = typeFinder.FindClassesOfType<IDependencyRegistrar>(); * var drInstances = new List<IDependencyRegistrar>(); * foreach (var drType in drTypes) * { * drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType)); * } * //sort * drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); * foreach (var dependencyRegistrar in drInstances) * { * dependencyRegistrar.Register(builder, typeFinder, config); * } * builder.Update(container); * * //注册webapi容器 * //参考:http://www.cnblogs.com/daisy-popule/p/4126599.html * builder = new ContainerBuilder(); * Assembly webApiAssembly = Assembly.Load("Scd.WebAPI"); * builder.RegisterApiControllers(webApiAssembly);//注册api容器的实现 * builder.Update(container); * * GlobalConfiguration.Configuration.DependencyResolver * = new AutofacWebApiDependencyResolver(container);//注册api容器 * * //set dependency resolver * DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); */ #endregion var builder = new ContainerBuilder(); //dependencies var typeFinder = new WebAppTypeFinder(); builder.RegisterInstance(this).As <IEngine>().SingleInstance(); builder.RegisterInstance(typeFinder).As <ITypeFinder>().SingleInstance(); //register dependencies provided by other assemblies var drTypes = typeFinder.FindClassesOfType <IDependencyRegistrar>(); var drInstances = new List <IDependencyRegistrar>(); foreach (var drType in drTypes) { drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType)); } //sort drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); foreach (var dependencyRegistrar in drInstances) { dependencyRegistrar.Register(builder, typeFinder); } try { //注册webapi容器 Assembly webApiAssembly = Assembly.Load("Nop.WebAPI"); builder.RegisterApiControllers(webApiAssembly);//注册api容器的实现 } catch { //单元测试的时候,加载不到这个dll } var container = builder.Build(); this._containerManager = new ContainerManager(container); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);//注册api容器 //set dependency resolver DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); }