Mercurial > pub > ImplabNet
comparison Implab.ServiceHost/Unity/FactoryActivator.cs @ 279:8714471e8d78 v3
Container configuration cleanup, RC2
| author | cin | 
|---|---|
| date | Fri, 04 May 2018 18:12:42 +0300 | 
| parents | 6691aff01de1 | 
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| 278:6691aff01de1 | 279:8714471e8d78 | 
|---|---|
| 1 using System; | 1 using System; | 
| 2 using System.Collections.Generic; | |
| 3 using System.Reflection; | |
| 4 using Implab.Components; | |
| 5 using Unity; | |
| 6 using Unity.Injection; | |
| 7 using Unity.Lifetime; | |
| 2 | 8 | 
| 3 namespace Implab.ServiceHost.Unity { | 9 namespace Implab.ServiceHost.Unity { | 
| 4 public class FactoryActivator : FactoryAbstractRegistratrion { | 10 public class FactoryActivator : ITypeRegistration { | 
| 11 | |
| 12 class FactoryInjector : ITypeMemberInjection { | |
| 13 public InjectionFactory Factory { get; set; } | |
| 14 public void Visit(TypeRegistrationBuilder builder) { | |
| 15 builder.AddInjectionMember(Factory); | |
| 16 } | |
| 17 } | |
| 18 | |
| 5 | 19 | 
| 6 public Type FactoryType { get; set; } | 20 public Type FactoryType { get; set; } | 
| 7 | 21 | 
| 8 public string FactoryName { get; set; } | 22 public string FactoryName { get; set; } | 
| 9 | 23 | 
| 10 public new Type RegistrationType { get; set; } | 24 public Type RegistrationType { get; set; } | 
| 11 | 25 | 
| 12 public override void Visit(FactoryRegistrationBuilder builder) { | 26 public LifetimeManager Lifetime { get; set; } | 
| 13 base.Visit(builder); | |
| 14 | 27 | 
| 15 builder.GetType() | 28 public IEnumerable<ITypeMemberInjection> MemberInjections { | 
| 16 .GetMethod( | 29 get { | 
| 17 nameof(FactoryRegistrationBuilder.SetFactoryDependency) | 30 yield return new FactoryInjector { | 
| 18 , new[] { typeof(string) } | 31 Factory = (InjectionFactory)GetType() | 
| 19 ) | 32 .GetMethod(nameof(CreateInjectionFactory), BindingFlags.Static | BindingFlags.NonPublic) | 
| 20 .MakeGenericMethod(FactoryType, RegistrationType) | 33 .MakeGenericMethod(FactoryType, RegistrationType) | 
| 21 .Invoke(builder, new[] { FactoryName }); | 34 .Invoke(null, new [] { FactoryName }) | 
| 35 }; | |
| 36 } | |
| 22 } | 37 } | 
| 23 | 38 | 
| 24 public override Type GetRegistrationType(Func<string, Type> resolver) { | 39 public string Name { get; set; } | 
| 40 | |
| 41 public Type GetRegistrationType(ContainerBuilder builder) { | |
| 25 return RegistrationType; | 42 return RegistrationType; | 
| 26 } | 43 } | 
| 27 | 44 | 
| 45 public LifetimeManager GetLifetime(ContainerBuilder builder) { | |
| 46 return Lifetime; | |
| 47 } | |
| 48 | |
| 49 public Type GetImplementationType(ContainerBuilder builder) { | |
| 50 return null; | |
| 51 } | |
| 52 | |
| 53 /// <summary> | |
| 54 /// Указывает зависимость, реализующую интерфейс <see cref="IFactory{TObj}"/>, | |
| 55 /// которая будет использоваться в качестве фабрики для создания объектов | |
| 56 /// </summary> | |
| 57 /// <param name="dependencyName"></param> | |
| 58 static InjectionFactory CreateInjectionFactory<TFac, TObj>(string dependencyName) where TFac : IFactory<TObj> { | |
| 59 | |
| 60 return new InjectionFactory(c => c.Resolve<TFac>(dependencyName).Create()); | |
| 61 } | |
| 28 } | 62 } | 
| 29 } | 63 } | 
