view Implab.ServiceHost/Unity/FactoryRegistrationBuilder.cs @ 278:6691aff01de1 v3

Implab: added XmlDefaultSeializer (SerializersPool is now obsolete) Implab.ServiceHost: rewritten TypeReference (added support for nested types), stable API
author cin
date Thu, 03 May 2018 09:59:44 +0300
parents 963b17c275be
children
line wrap: on
line source

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) {
        }

        /// <summary>
        /// Задает делегат, который будет использоваться в качестве фабрики
        /// для создания экземпляров, параметры делагата будет заполнены
        /// соответствующими зависимостями.
        /// </summary>
        /// <param name="factory">Фабрика для создания экземпляров.</param>
        public void SetFactoryDelegate(Delegate factory) {
            Safe.ArgumentNotNull(factory, nameof(factory));

            Factory = new DelegateInjectionFactory(factory);
        }

        /// <summary>
        /// Указывает зависимость типа <typeparamref name="T"/> с именем
        /// <paramref name="dependencyName"/>, которая будет передана в качетве
        /// параметра делегату <paramref name="factory"/>
        /// </summary>
        /// <param name="dependencyName">Имя зависимости</param>
        /// <param name="factory">Фабрика для создания экземпляра</param>
        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);
            });
        }

        /// <summary>
        /// Указывает зависимость, реализующую интерфейс <see cref="IFactory{TObj}"/>,
        /// которая будет использоваться в качестве фабрики для создания объектов
        /// </summary>
        /// <param name="dependencyName"></param>
        public void SetFactoryDependency<TFac, TObj>(string dependencyName) where TFac : IFactory<TObj> {
            
            Factory = new InjectionFactory(c => c.Resolve<TFac>(dependencyName).Create());
        }
    }
}