SinglethonWithParamsManager.cs

65 lines | 1.684 kB Blame History Raw Download
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Tools.SingletonTool.Base;


namespace Tools.SingletonTool.Manager
{
    /// <summary>
    /// Синглтон с параметром создания
    /// </summary>
    /// <typeparam name="T">Тип синглот</typeparam>
    /// <typeparam name="P">Тип параметра</typeparam>
    public class SinglethonWithParamsManager<T, P>
        : ISignlethonManager<T>
        where T : class, ISignlethonWithParams<P>, new()
    {
        private static P Param;
        private static bool IsParamSet = false;

        private static readonly Lazy<T> Single
            = new Lazy<T>(() => {
                if (!IsParamSet)
                {
                    throw new Exception("Instance not create. Use SignlethonWithParamsManager(P param) first");
                }

                T single = new T();
                single.SetParams(Param);
                Param = default(P);

                return single;
            }, 
                true);


        public SinglethonWithParamsManager() 
        {            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="param">Параметры для создания экземпляра. Not null</param>
        public SinglethonWithParamsManager(P param) 
        {
            //Возможно добавить синхронность
            if (!IsParamSet)
            {
                Param = param;
                IsParamSet = true;
            }
        }

        public T Get
            => Single.Value;

        public bool ExistInstance
            => Single.IsValueCreated;

    }
}