FactoryRegistrationBuilder.cs
53 lines
| 2.4 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r277 | using System; | |
using Implab.Components; | |||
using Unity; | |||
using Unity.Injection; | |||
using Unity.Registration; | |||
namespace Implab.ServiceHost.Unity | |||
{ | |||
public class FactoryRegistrationBuilder : RegistrationBuilder { | |||
internal InjectionMember Factory { get; private set; } | |||
internal FactoryRegistrationBuilder(Type registrationType) : base(registrationType) { | |||
} | |||
cin
|
r278 | /// <summary> | |
/// Задает делегат, который будет использоваться в качестве фабрики | |||
/// для создания экземпляров, параметры делагата будет заполнены | |||
/// соответствующими зависимостями. | |||
/// </summary> | |||
/// <param name="factory">Фабрика для создания экземпляров.</param> | |||
cin
|
r277 | public void SetFactoryDelegate(Delegate factory) { | |
Safe.ArgumentNotNull(factory, nameof(factory)); | |||
Factory = new DelegateInjectionFactory(factory); | |||
} | |||
cin
|
r278 | /// <summary> | |
/// Указывает зависимость типа <typeparamref name="T"/> с именем | |||
/// <paramref name="dependencyName"/>, которая будет передана в качетве | |||
/// параметра делегату <paramref name="factory"/> | |||
/// </summary> | |||
/// <param name="dependencyName">Имя зависимости</param> | |||
/// <param name="factory">Фабрика для создания экземпляра</param> | |||
cin
|
r277 | public void SetFactoryDependency<T>(string dependencyName, Func<T, object> factory) { | |
Safe.ArgumentNotNull(factory, nameof(factory)); | |||
Factory = new InjectionFactory((c,t,name) => { | |||
var backend = c.Resolve<T>(dependencyName); | |||
return factory(backend); | |||
}); | |||
} | |||
cin
|
r278 | /// <summary> | |
/// Указывает зависимость, реализующую интерфейс <see cref="IFactory{TObj}"/>, | |||
/// которая будет использоваться в качестве фабрики для создания объектов | |||
/// </summary> | |||
/// <param name="dependencyName"></param> | |||
cin
|
r277 | public void SetFactoryDependency<TFac, TObj>(string dependencyName) where TFac : IFactory<TObj> { | |
Factory = new InjectionFactory(c => c.Resolve<TFac>(dependencyName).Create()); | |||
} | |||
} | |||
} |