Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

autofac container settable #21

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -156,3 +156,4 @@ $RECYCLE.BIN/
# Mac desktop service store files
.DS_Store
/src/.vs/ECommon/v15
/src/.vs/ECommon/v16/Server/sqlite3
145 changes: 83 additions & 62 deletions src/ECommon.Autofac/AutofacObjectContainer.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;
using Autofac;
using Autofac;
using ECommon.Components;
using System;

namespace ECommon.Autofac
{
Expand All @@ -9,36 +9,38 @@ namespace ECommon.Autofac
public class AutofacObjectContainer : IObjectContainer
{
private readonly ContainerBuilder _containerBuilder;
private IContainer _container;
private ILifetimeScope _container;

/// <summary>Default constructor.
/// </summary>
public AutofacObjectContainer() : this(new ContainerBuilder())
{
}

/// <summary>Parameterized constructor.
/// </summary>
public AutofacObjectContainer(ContainerBuilder containerBuilder)
{
_containerBuilder = containerBuilder;
}

/// <summary>Represents the iner autofac container builder.
/// <summary>Represents the inner autofac container.
/// </summary>
public ContainerBuilder ContainerBuilder
public ILifetimeScope Container
{
get
{
return _containerBuilder;
return _container;
}
}
/// <summary>Represents the inner autofac container.

/// <summary>Represents the iner autofac container builder.
/// </summary>
public IContainer Container
public ContainerBuilder ContainerBuilder
{
get
{
return _container;
return _containerBuilder;
}
}

Expand All @@ -48,6 +50,45 @@ public void Build()
{
_container = _containerBuilder.Build();
}

/// <summary>Register a implementer type as a service implementation.
/// </summary>
/// <typeparam name="TService">The service type.</typeparam>
/// <typeparam name="TImplementer">The implementer type.</typeparam>
/// <param name="serviceName">The service name.</param>
/// <param name="life">The life cycle of the implementer type.</param>
public void Register<TService, TImplementer>(string serviceName = null, LifeStyle life = LifeStyle.Singleton)
where TService : class
where TImplementer : class, TService
{
var registrationBuilder = _containerBuilder.RegisterType<TImplementer>().As<TService>();
if (serviceName != null)
{
registrationBuilder.Named<TService>(serviceName);
}
if (life == LifeStyle.Singleton)
{
registrationBuilder.SingleInstance();
}
}

/// <summary>Register a implementer type instance as a service implementation.
/// </summary>
/// <typeparam name="TService">The service type.</typeparam>
/// <typeparam name="TImplementer">The implementer type.</typeparam>
/// <param name="instance">The implementer type instance.</param>
/// <param name="serviceName">The service name.</param>
public void RegisterInstance<TService, TImplementer>(TImplementer instance, string serviceName = null)
where TService : class
where TImplementer : class, TService
{
var registrationBuilder = _containerBuilder.RegisterInstance(instance).As<TService>().SingleInstance();
if (serviceName != null)
{
registrationBuilder.Named<TService>(serviceName);
}
}

/// <summary>Register a implementation type.
/// </summary>
/// <param name="implementationType">The implementation type.</param>
Expand Down Expand Up @@ -80,6 +121,7 @@ public void RegisterType(Type implementationType, string serviceName = null, Lif
}
}
}

/// <summary>Register a implementer type as a service implementation.
/// </summary>
/// <param name="serviceType">The service type.</param>
Expand Down Expand Up @@ -113,58 +155,54 @@ public void RegisterType(Type serviceType, Type implementationType, string servi
}
}
}
/// <summary>Register a implementer type as a service implementation.

/// <summary>Resolve a service.
/// </summary>
/// <typeparam name="TService">The service type.</typeparam>
/// <typeparam name="TImplementer">The implementer type.</typeparam>
/// <param name="serviceName">The service name.</param>
/// <param name="life">The life cycle of the implementer type.</param>
public void Register<TService, TImplementer>(string serviceName = null, LifeStyle life = LifeStyle.Singleton)
where TService : class
where TImplementer : class, TService
/// <returns>The component instance that provides the service.</returns>
public TService Resolve<TService>() where TService : class
{
var registrationBuilder = _containerBuilder.RegisterType<TImplementer>().As<TService>();
if (serviceName != null)
{
registrationBuilder.Named<TService>(serviceName);
}
if (life == LifeStyle.Singleton)
{
registrationBuilder.SingleInstance();
}
return _container.Resolve<TService>();
}
/// <summary>Register a implementer type instance as a service implementation.

/// <summary>Resolve a service.
/// </summary>
/// <typeparam name="TService">The service type.</typeparam>
/// <typeparam name="TImplementer">The implementer type.</typeparam>
/// <param name="instance">The implementer type instance.</param>
/// <param name="serviceName">The service name.</param>
public void RegisterInstance<TService, TImplementer>(TImplementer instance, string serviceName = null)
where TService : class
where TImplementer : class, TService
/// <param name="serviceType">The service type.</param>
/// <returns>The component instance that provides the service.</returns>
public object Resolve(Type serviceType)
{
var registrationBuilder = _containerBuilder.RegisterInstance(instance).As<TService>().SingleInstance();
if (serviceName != null)
{
registrationBuilder.Named<TService>(serviceName);
}
return _container.Resolve(serviceType);
}

/// <summary>Resolve a service.
/// </summary>
/// <typeparam name="TService">The service type.</typeparam>
/// <param name="serviceName">The service name.</param>
/// <returns>The component instance that provides the service.</returns>
public TService Resolve<TService>() where TService : class
public TService ResolveNamed<TService>(string serviceName) where TService : class
{
return _container.Resolve<TService>();
return _container.ResolveNamed<TService>(serviceName);
}

/// <summary>Resolve a service.
/// </summary>
/// <param name="serviceName">The service name.</param>
/// <param name="serviceType">The service type.</param>
/// <returns>The component instance that provides the service.</returns>
public object Resolve(Type serviceType)
public object ResolveNamed(string serviceName, Type serviceType)
{
return _container.Resolve(serviceType);
return _container.ResolveNamed(serviceName, serviceType);
}

/// <summary>
/// Set container
/// </summary>
/// <param name="container">container</param>
public void SetContainer(ILifetimeScope container)
{
_container = container;
}

/// <summary>Try to retrieve a service from the container.
/// </summary>
/// <typeparam name="TService">The service type to resolve.</typeparam>
Expand All @@ -174,6 +212,7 @@ public bool TryResolve<TService>(out TService instance) where TService : class
{
return _container.TryResolve(out instance);
}

/// <summary>Try to retrieve a service from the container.
/// </summary>
/// <param name="serviceType">The service type to resolve.</param>
Expand All @@ -183,24 +222,7 @@ public bool TryResolve(Type serviceType, out object instance)
{
return _container.TryResolve(serviceType, out instance);
}
/// <summary>Resolve a service.
/// </summary>
/// <typeparam name="TService">The service type.</typeparam>
/// <param name="serviceName">The service name.</param>
/// <returns>The component instance that provides the service.</returns>
public TService ResolveNamed<TService>(string serviceName) where TService : class
{
return _container.ResolveNamed<TService>(serviceName);
}
/// <summary>Resolve a service.
/// </summary>
/// <param name="serviceName">The service name.</param>
/// <param name="serviceType">The service type.</param>
/// <returns>The component instance that provides the service.</returns>
public object ResolveNamed(string serviceName, Type serviceType)
{
return _container.ResolveNamed(serviceName, serviceType);
}

/// <summary>Try to retrieve a service from the container.
/// </summary>
/// <param name="serviceName">The name of the service to resolve.</param>
Expand All @@ -212,5 +234,4 @@ public bool TryResolveNamed(string serviceName, Type serviceType, out object ins
return _container.TryResolveNamed(serviceName, serviceType, out instance);
}
}
}

}
16 changes: 16 additions & 0 deletions src/ECommon.Autofac/ObjectContainerExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Autofac;
using ECommon.Components;
using System;

namespace ECommon.Autofac
{
public static class ObjectContainerExtensions
{
public static void SetContainer(this IObjectContainer objectContainer, ILifetimeScope container)
{
if (!(objectContainer is AutofacObjectContainer autofacObjectContainer))
throw new InvalidOperationException($"instance of {nameof(ObjectContainer)} is not of type {nameof(AutofacObjectContainer)}");
autofacObjectContainer.SetContainer(container);
}
}
}