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]; }
public ConstructorBuilder(ConstructorCreater <T, TReal> creater, Container container) { _creater = creater; _container = container; }
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); }