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()); } } }