mirror of https://github.com/abpframework/abp.git
7 changed files with 367 additions and 110 deletions
@ -0,0 +1,122 @@ |
|||
// This software is part of the Autofac IoC container
|
|||
// Copyright © 2015 Autofac Contributors
|
|||
// https://autofac.org
|
|||
//
|
|||
// Permission is hereby granted, free of charge, to any person
|
|||
// obtaining a copy of this software and associated documentation
|
|||
// files (the "Software"), to deal in the Software without
|
|||
// restriction, including without limitation the rights to use,
|
|||
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
// copies of the Software, and to permit persons to whom the
|
|||
// Software is furnished to do so, subject to the following
|
|||
// conditions:
|
|||
//
|
|||
// The above copyright notice and this permission notice shall be
|
|||
// included in all copies or substantial portions of the Software.
|
|||
//
|
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|||
// OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|||
using System; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
|
|||
namespace Autofac.Extensions.DependencyInjection |
|||
{ |
|||
/// <summary>
|
|||
/// Autofac implementation of the ASP.NET Core <see cref="IServiceProvider"/>.
|
|||
/// </summary>
|
|||
/// <seealso cref="System.IServiceProvider" />
|
|||
/// <seealso cref="Microsoft.Extensions.DependencyInjection.ISupportRequiredService" />
|
|||
public class AutofacServiceProvider : IServiceProvider, ISupportRequiredService, IDisposable |
|||
{ |
|||
private readonly ILifetimeScope _lifetimeScope; |
|||
|
|||
private bool _disposed = false; |
|||
|
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="AutofacServiceProvider"/> class.
|
|||
/// </summary>
|
|||
/// <param name="lifetimeScope">
|
|||
/// The lifetime scope from which services will be resolved.
|
|||
/// </param>
|
|||
public AutofacServiceProvider(ILifetimeScope lifetimeScope) |
|||
{ |
|||
this._lifetimeScope = lifetimeScope; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets service of type <paramref name="serviceType" /> from the
|
|||
/// <see cref="AutofacServiceProvider" /> and requires it be present.
|
|||
/// </summary>
|
|||
/// <param name="serviceType">
|
|||
/// An object that specifies the type of service object to get.
|
|||
/// </param>
|
|||
/// <returns>
|
|||
/// A service object of type <paramref name="serviceType" />.
|
|||
/// </returns>
|
|||
/// <exception cref="Autofac.Core.Registration.ComponentNotRegisteredException">
|
|||
/// Thrown if the <paramref name="serviceType" /> isn't registered with the container.
|
|||
/// </exception>
|
|||
/// <exception cref="Autofac.Core.DependencyResolutionException">
|
|||
/// Thrown if the object can't be resolved from the container.
|
|||
/// </exception>
|
|||
public object GetRequiredService(Type serviceType) |
|||
{ |
|||
return this._lifetimeScope.Resolve(serviceType); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the service object of the specified type.
|
|||
/// </summary>
|
|||
/// <param name="serviceType">
|
|||
/// An object that specifies the type of service object to get.
|
|||
/// </param>
|
|||
/// <returns>
|
|||
/// A service object of type <paramref name="serviceType" />; or <see langword="null" />
|
|||
/// if there is no service object of type <paramref name="serviceType" />.
|
|||
/// </returns>
|
|||
public object GetService(Type serviceType) |
|||
{ |
|||
return this._lifetimeScope.ResolveOptional(serviceType); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the underlying instance of <see cref="ILifetimeScope" />.
|
|||
/// </summary>
|
|||
public ILifetimeScope LifetimeScope => _lifetimeScope; |
|||
|
|||
/// <summary>
|
|||
/// Releases unmanaged and - optionally - managed resources.
|
|||
/// </summary>
|
|||
/// <param name="disposing">
|
|||
/// <see langword="true" /> to release both managed and unmanaged resources;
|
|||
/// <see langword="false" /> to release only unmanaged resources.
|
|||
/// </param>
|
|||
protected virtual void Dispose(bool disposing) |
|||
{ |
|||
if (!this._disposed) |
|||
{ |
|||
this._disposed = true; |
|||
if (disposing) |
|||
{ |
|||
this._lifetimeScope.Dispose(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
|
|||
/// </summary>
|
|||
public void Dispose() |
|||
{ |
|||
this.Dispose(true); |
|||
GC.SuppressFinalize(this); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,77 @@ |
|||
// This software is part of the Autofac IoC container
|
|||
// Copyright © 2017 Autofac Contributors
|
|||
// http://autofac.org
|
|||
//
|
|||
// Permission is hereby granted, free of charge, to any person
|
|||
// obtaining a copy of this software and associated documentation
|
|||
// files (the "Software"), to deal in the Software without
|
|||
// restriction, including without limitation the rights to use,
|
|||
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
// copies of the Software, and to permit persons to whom the
|
|||
// Software is furnished to do so, subject to the following
|
|||
// conditions:
|
|||
//
|
|||
// The above copyright notice and this permission notice shall be
|
|||
// included in all copies or substantial portions of the Software.
|
|||
//
|
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|||
// OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|||
using System; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
|
|||
namespace Autofac.Extensions.DependencyInjection |
|||
{ |
|||
/// <summary>
|
|||
/// A factory for creating a <see cref="ContainerBuilder"/> and an <see cref="T:System.IServiceProvider" />.
|
|||
/// </summary>
|
|||
public class AutofacServiceProviderFactory : IServiceProviderFactory<ContainerBuilder> |
|||
{ |
|||
private readonly Action<ContainerBuilder> _configurationAction; |
|||
|
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="AutofacServiceProviderFactory"/> class.
|
|||
/// </summary>
|
|||
/// <param name="configurationAction">Action on a <see cref="ContainerBuilder"/> that adds component registrations to the container.</param>
|
|||
public AutofacServiceProviderFactory(Action<ContainerBuilder> configurationAction = null) |
|||
{ |
|||
_configurationAction = configurationAction ?? (builder => { }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a container builder from an <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />.
|
|||
/// </summary>
|
|||
/// <param name="services">The collection of services</param>
|
|||
/// <returns>A container builder that can be used to create an <see cref="T:System.IServiceProvider" />.</returns>
|
|||
public ContainerBuilder CreateBuilder(IServiceCollection services) |
|||
{ |
|||
var builder = new ContainerBuilder(); |
|||
|
|||
builder.Populate(services); |
|||
|
|||
_configurationAction(builder); |
|||
|
|||
return builder; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an <see cref="T:System.IServiceProvider" /> from the container builder.
|
|||
/// </summary>
|
|||
/// <param name="containerBuilder">The container builder</param>
|
|||
/// <returns>An <see cref="T:System.IServiceProvider" /></returns>
|
|||
public IServiceProvider CreateServiceProvider(ContainerBuilder containerBuilder) |
|||
{ |
|||
if (containerBuilder == null) throw new ArgumentNullException(nameof(containerBuilder)); |
|||
|
|||
var container = containerBuilder.Build(); |
|||
|
|||
return new AutofacServiceProvider(container); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,67 @@ |
|||
// This software is part of the Autofac IoC container
|
|||
// Copyright © 2015 Autofac Contributors
|
|||
// http://autofac.org
|
|||
//
|
|||
// Permission is hereby granted, free of charge, to any person
|
|||
// obtaining a copy of this software and associated documentation
|
|||
// files (the "Software"), to deal in the Software without
|
|||
// restriction, including without limitation the rights to use,
|
|||
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
// copies of the Software, and to permit persons to whom the
|
|||
// Software is furnished to do so, subject to the following
|
|||
// conditions:
|
|||
//
|
|||
// The above copyright notice and this permission notice shall be
|
|||
// included in all copies or substantial portions of the Software.
|
|||
//
|
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|||
// OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|||
using System; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
|
|||
namespace Autofac.Extensions.DependencyInjection |
|||
{ |
|||
/// <summary>
|
|||
/// Autofac implementation of the ASP.NET Core <see cref="IServiceScope"/>.
|
|||
/// </summary>
|
|||
/// <seealso cref="Microsoft.Extensions.DependencyInjection.IServiceScope" />
|
|||
internal class AutofacServiceScope : IServiceScope |
|||
{ |
|||
private readonly ILifetimeScope _lifetimeScope; |
|||
|
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="AutofacServiceScope"/> class.
|
|||
/// </summary>
|
|||
/// <param name="lifetimeScope">
|
|||
/// The lifetime scope from which services should be resolved for this service scope.
|
|||
/// </param>
|
|||
public AutofacServiceScope(ILifetimeScope lifetimeScope) |
|||
{ |
|||
this._lifetimeScope = lifetimeScope; |
|||
this.ServiceProvider = this._lifetimeScope.Resolve<IServiceProvider>(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets an <see cref="IServiceProvider" /> corresponding to this service scope.
|
|||
/// </summary>
|
|||
/// <value>
|
|||
/// An <see cref="IServiceProvider" /> that can be used to resolve dependencies from the scope.
|
|||
/// </value>
|
|||
public IServiceProvider ServiceProvider { get; } |
|||
|
|||
/// <summary>
|
|||
/// Disposes of the lifetime scope and resolved disposable services.
|
|||
/// </summary>
|
|||
public void Dispose() |
|||
{ |
|||
this._lifetimeScope.Dispose(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,65 @@ |
|||
// This software is part of the Autofac IoC container
|
|||
// Copyright © 2015 Autofac Contributors
|
|||
// http://autofac.org
|
|||
//
|
|||
// Permission is hereby granted, free of charge, to any person
|
|||
// obtaining a copy of this software and associated documentation
|
|||
// files (the "Software"), to deal in the Software without
|
|||
// restriction, including without limitation the rights to use,
|
|||
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
// copies of the Software, and to permit persons to whom the
|
|||
// Software is furnished to do so, subject to the following
|
|||
// conditions:
|
|||
//
|
|||
// The above copyright notice and this permission notice shall be
|
|||
// included in all copies or substantial portions of the Software.
|
|||
//
|
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|||
// OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|||
using System.Diagnostics.CodeAnalysis; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
|
|||
namespace Autofac.Extensions.DependencyInjection |
|||
{ |
|||
/// <summary>
|
|||
/// Autofac implementation of the ASP.NET Core <see cref="IServiceScopeFactory"/>.
|
|||
/// </summary>
|
|||
/// <seealso cref="Microsoft.Extensions.DependencyInjection.IServiceScopeFactory" />
|
|||
[SuppressMessage("Microsoft.ApiDesignGuidelines", "CA2213", Justification = "The creator of the root service lifetime scope is responsible for disposal.")] |
|||
internal class AutofacServiceScopeFactory : IServiceScopeFactory |
|||
{ |
|||
private readonly ILifetimeScope _lifetimeScope; |
|||
|
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="AutofacServiceScopeFactory"/> class.
|
|||
/// </summary>
|
|||
/// <param name="lifetimeScope">The lifetime scope.</param>
|
|||
public AutofacServiceScopeFactory(ILifetimeScope lifetimeScope) |
|||
{ |
|||
this._lifetimeScope = lifetimeScope; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an <see cref="IServiceScope" /> which contains an
|
|||
/// <see cref="System.IServiceProvider" /> used to resolve dependencies within
|
|||
/// the scope.
|
|||
/// </summary>
|
|||
/// <returns>
|
|||
/// An <see cref="IServiceScope" /> controlling the lifetime of the scope. Once
|
|||
/// this is disposed, any scoped services that have been resolved
|
|||
/// from the <see cref="IServiceScope.ServiceProvider" />
|
|||
/// will also be disposed.
|
|||
/// </returns>
|
|||
public IServiceScope CreateScope() |
|||
{ |
|||
return new AutofacServiceScope(this._lifetimeScope.BeginLifetimeScope()); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue