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) {
}
///
/// Задает делегат, который будет использоваться в качестве фабрики
/// для создания экземпляров, параметры делагата будет заполнены
/// соответствующими зависимостями.
///
/// Фабрика для создания экземпляров.
public void SetFactoryDelegate(Delegate factory) {
Safe.ArgumentNotNull(factory, nameof(factory));
Factory = new DelegateInjectionFactory(factory);
}
///
/// Указывает зависимость типа с именем
/// , которая будет передана в качетве
/// параметра делегату
///
/// Имя зависимости
/// Фабрика для создания экземпляра
public void SetFactoryDependency(string dependencyName, Func factory) {
Safe.ArgumentNotNull(factory, nameof(factory));
Factory = new InjectionFactory((c,t,name) => {
var backend = c.Resolve(dependencyName);
return factory(backend);
});
}
///
/// Указывает зависимость, реализующую интерфейс ,
/// которая будет использоваться в качестве фабрики для создания объектов
///
///
public void SetFactoryDependency(string dependencyName) where TFac : IFactory {
Factory = new InjectionFactory(c => c.Resolve(dependencyName).Create());
}
}
}