-
-
Save cwe1ss/050a531e2711f5b62ab0 to your computer and use it in GitHub Desktop.
| public IServiceProvider ConfigureServices(IServiceCollection services) | |
| { | |
| // Configure regular ASP.NET Core services | |
| services.AddMvc(); | |
| // ... | |
| // Send configuration to Castle Windsor | |
| Container.Populate(services); | |
| Container.BeginScope(); | |
| return Container.Resolve<IServiceProvider>(); | |
| } |
| using Castle.MicroKernel.Registration; | |
| using Castle.MicroKernel.Resolvers.SpecializedResolvers; | |
| using Castle.Windsor; | |
| using Microsoft.Extensions.DependencyInjection; | |
| using System; | |
| using System.Collections.Generic; | |
| namespace Castle.Facilities.AspNetCoreIntegration | |
| { | |
| public static class WindsorRegistration | |
| { | |
| public static void Populate(this IWindsorContainer container, | |
| IEnumerable<Microsoft.Extensions.DependencyInjection.ServiceDescriptor> descriptors) | |
| { | |
| container.Register(Component.For<IWindsorContainer>().Instance(container).OnlyNewServices()); | |
| container.Register(Component.For<IServiceProvider>().ImplementedBy<WindsorServiceProvider>()); | |
| container.Register(Component.For<IServiceScopeFactory>().ImplementedBy<WindsorServiceScopeFactory>()); | |
| // ASP.NET Core uses IEnumerable<T> to resolve a list of types. | |
| // Since some of these types are optional, Windsor must also return empty collections. | |
| container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel, allowEmptyCollections: true)); | |
| Register(container, descriptors); | |
| } | |
| private static void Register(IWindsorContainer container, | |
| IEnumerable<Microsoft.Extensions.DependencyInjection.ServiceDescriptor> descriptors) | |
| { | |
| foreach (var descriptor in descriptors) | |
| { | |
| if (descriptor.ImplementationType != null) | |
| { | |
| container.Register( | |
| Component.For(descriptor.ServiceType) | |
| .ImplementedBy(descriptor.ImplementationType) | |
| .ConfigureLifecycle(descriptor.Lifetime)); | |
| } | |
| else if (descriptor.ImplementationFactory != null) | |
| { | |
| var service1 = descriptor; | |
| container.Register( | |
| Component.For(descriptor.ServiceType) | |
| .UsingFactoryMethod(c => | |
| { | |
| var serviceProvider = container.Resolve<IServiceProvider>(); | |
| return service1.ImplementationFactory(serviceProvider); | |
| }) | |
| .ConfigureLifecycle(descriptor.Lifetime)); | |
| } | |
| else | |
| { | |
| container.Register( | |
| Component.For(descriptor.ServiceType) | |
| .Named(descriptor.ServiceType.FullName) | |
| .Instance(descriptor.ImplementationInstance) | |
| .ConfigureLifecycle(descriptor.Lifetime)); | |
| } | |
| } | |
| } | |
| private static ComponentRegistration<object> ConfigureLifecycle( | |
| this ComponentRegistration<object> registrationBuilder, | |
| ServiceLifetime serviceLifetime) | |
| { | |
| switch (serviceLifetime) | |
| { | |
| case ServiceLifetime.Singleton: | |
| registrationBuilder.LifestyleSingleton(); | |
| break; | |
| case ServiceLifetime.Scoped: | |
| registrationBuilder.LifestyleScoped(); | |
| break; | |
| case ServiceLifetime.Transient: | |
| registrationBuilder.LifestyleTransient(); | |
| break; | |
| } | |
| return registrationBuilder; | |
| } | |
| } | |
| } |
| using Castle.Windsor; | |
| using System; | |
| using System.Collections.Generic; | |
| using System.Reflection; | |
| namespace Castle.Facilities.AspNetCoreIntegration | |
| { | |
| public class WindsorServiceProvider : IServiceProvider | |
| { | |
| private readonly IWindsorContainer _container; | |
| public WindsorServiceProvider(IWindsorContainer container) | |
| { | |
| _container = container; | |
| } | |
| public object GetService(Type serviceType) | |
| { | |
| // ASP.NET uses GetService<IEnumerable<TDesiredType>>() to get a collection. | |
| // This must be resolved to IWindsorContainer.ResolveAll(); | |
| var typeInfo = serviceType.GetTypeInfo(); | |
| if (typeInfo.IsGenericType && serviceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) | |
| { | |
| var itemType = typeInfo.GenericTypeArguments[0]; | |
| return _container.ResolveAll(itemType); | |
| } | |
| // Microsoft.Extensions.DependencyInjection is built to handle optional registrations. | |
| // However Castle Windsor throws ComponentNotFoundException when a type wasn't registered. | |
| // For this reason we have to manually check if the type exists in Windsor. | |
| if (_container.Kernel.HasComponent(serviceType)) | |
| { | |
| return _container.Resolve(serviceType); | |
| } | |
| return null; | |
| } | |
| } | |
| } |
| using Castle.MicroKernel.Lifestyle; | |
| using Castle.Windsor; | |
| using Microsoft.Extensions.DependencyInjection; | |
| using System; | |
| namespace Castle.Facilities.AspNetCoreIntegration | |
| { | |
| public class WindsorServiceScope : IServiceScope | |
| { | |
| private readonly IServiceProvider _serviceProvider; | |
| private readonly IDisposable _scope; | |
| public WindsorServiceScope(IWindsorContainer container) | |
| { | |
| _scope = container.BeginScope(); | |
| _serviceProvider = container.Resolve<IServiceProvider>(); | |
| } | |
| public IServiceProvider ServiceProvider => _serviceProvider; | |
| public void Dispose() | |
| { | |
| _scope.Dispose(); | |
| } | |
| } | |
| } |
| using Castle.Windsor; | |
| using Microsoft.Extensions.DependencyInjection; | |
| namespace Castle.Facilities.AspNetCoreIntegration | |
| { | |
| public class WindsorServiceScopeFactory : IServiceScopeFactory | |
| { | |
| private readonly IWindsorContainer _container; | |
| public WindsorServiceScopeFactory(IWindsorContainer container) | |
| { | |
| _container = container; | |
| } | |
| public IServiceScope CreateScope() | |
| { | |
| return new WindsorServiceScope(_container); | |
| } | |
| } | |
| } |
ComponentRegistrationException:
I copy your code in my asp.net core
but An error occurred while starting the application.
ComponentRegistrationException: Component Microsoft.Extensions.Options.OptionsManager`1 could not be registered. There is already a component with that name. Did you want to modify the existing component instead? If not, make sure you specify a unique name.
Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register(IHandler handler)
ComponentRegistrationException: Component Microsoft.Extensions.Options.OptionsManager`1 could not be registered. There is already a component with that name. Did you want to modify the existing component instead? If not, make sure you specify a unique name.
Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register(IHandler handler)
Castle.MicroKernel.DefaultKernel.AddCustomComponent(ComponentModel model)
Castle.MicroKernel.Registration.ComponentRegistration.Castle.MicroKernel.Registration.IRegistration.Register(IKernelInternal kernel)
Castle.MicroKernel.DefaultKernel.Register(IRegistration[] registrations)
Castle.Windsor.WindsorContainer.Register(IRegistration[] registrations)
BlueBlog.Utility.WindsorRegistration.Register(IWindsorContainer container, IEnumerable descriptors) in WindsorRegistration.cs
+
container.Register(
BlueBlog.Utility.WindsorRegistration.Populate(IocContainer container, IEnumerable descriptors) in WindsorRegistration.cs
+
Register(container.Container, descriptors);
BlueBlog.Startup.ConfigureServices(IServiceCollection services) in Startup.cs
+
container.Populate(services);
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
How should I solve this error ?
great