Esempio n. 1
0
        public Container()
        {
            _getDelegateFunc = x => GetCreater(x).GetGenerator().GetInstanceMethod();
            _getCreaterFunc  = x =>
            {
#if NETSTANDARD1_1
                var ti = x.GetTypeInfo();

                // サブタイプが登録されているか検索
                var subtypes = _createrList.Keys.Where(y => y.GetTypeInfo().IsSubclassOf(x)).ToList();
#else
                var subtypes = _createrList.Keys.Where(y => y.IsSubclassOf(x)).ToList();
#endif
                if (subtypes.Count > 1)
                {
                    throw new ArgumentException(string.Format("型が一意に決まりません[{0}]", x));
                }
                if (subtypes.Count == 1)
                {
                    return(_createrList[subtypes[0]]);
                }

#if NETSTANDARD1_1
                if (ti.IsGenericType)
#else
                if (x.IsGenericType)
#endif
                {
                    var gd = x.GetGenericTypeDefinition();

                    // 欲しいインスタンスがFunc<T> である場合
                    if (gd == typeof(Func <>))
                    {
#if NETSTANDARD1_1
                        var ga = ti.GenericTypeArguments[0];
#else
                        var ga = x.GetGenericArguments()[0];
#endif
                        var baseCreater = GetCreater(ga);
                        var funcCreater = baseCreater.GetFuncCreater();
                        _createrList.Add(funcCreater);
                        return(_createrList[x]);
                    }

                    // 欲しいインスタンスがLazy<T> である場合
                    if (gd == typeof(Lazy <>))
                    {
#if NETSTANDARD1_1
                        var ga = ti.GenericTypeArguments[0];
#else
                        var ga = x.GetGenericArguments()[0];
#endif
                        var baseCreater = GetCreater(ga);
                        var lazyCreater = baseCreater.GetLazyCreater();
                        _createrList.Add(lazyCreater);
                        return(_createrList[x]);
                    }
                }

                // 抽象型・インターフェース・ジェネリック定義型でない場合
#if NETSTANDARD1_1
                if (!ti.IsAbstract && !ti.IsInterface && !ti.IsGenericTypeDefinition)
#else
                if (!x.IsAbstract && !x.IsInterface && !x.IsGenericTypeDefinition)
#endif
                {
                    var creater = ConstructorCreater.CreateStore(x, DeclareMode.Explicit, Lifecycle.Transient, this);
                    _createrList.Add(creater);
                    return(_createrList[x]);
                }
                throw new KeyNotFoundException(String.Format("指定されたキーはディレクトリ内に存在しませんでした。[{0}]", x.FullName));
            };
            _updateCreaterFunc = (x, y) => _createrList[x];
        }
Esempio n. 2
0
 public ConstructorBuilder(ConstructorCreater <T, TReal> creater, Container container)
 {
     _creater   = creater;
     _container = container;
 }
Esempio n. 3
0
        public void As <TResult>(Lifecycle lifecycle = Lifecycle.Transient) where TResult : T
        {
            ConstructorCreater <T, TResult> creater = new ConstructorCreater <T, TResult>(DeclareMode.Explicit, lifecycle, _container);

            _container.AddCreater(creater);
        }