public virtual TRepo Use <TRepo>(ISqlDbSession dbSession) where TRepo : ISqlRepo { // 這個 Func 主要是設定 Constructor 當中的 Parameters // 在 Activator.CreateInstance 時塞入 var repo = _sqlRepoFactory.Create <TRepo>(ctorParamInfos => { var args = new List <object>(); foreach (var param in ctorParamInfos) { // new SqlRepo(ISqlUnitOfWork: null); if (param.ParameterType == typeof(ISqlUnitOfWork)) { args.Add(default(object)); } else { var arg = _serviceProvider.GetService(param.ParameterType); args.Add(arg); } } return(args.ToArray()); }, dbSession); return(repo); }
public TRepo Create <TRepo>(Func <ParameterInfo[], object[]> argsFunc, ISqlDbSession dbSession) where TRepo : ISqlRepo { var iRepoType = typeof(TRepo); var repoImpTypes = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(s => s.GetTypes()) .Where(p => iRepoType.IsAssignableFrom(p) && p.IsClass && !p.IsAbstract).ToList(); if (!repoImpTypes.IsSingle()) { throw new InvalidOperationException($"{iRepoType.FullName}'s implementation class is not single."); } var repoType = repoImpTypes.Single(); var ctors = repoType.GetConstructors(); if (!ctors.IsSingle()) { throw new InvalidOperationException($"{iRepoType.FullName}'s constructor is not single."); } var ctorParamInfos = ctors.Single().GetParameters(); var args = argsFunc(ctorParamInfos); var repo = (TRepo)Activator.CreateInstance(repoType, args); (repo as IRepo).DbSession = dbSession; _waitingTobeDisposedRepo.Add(repo); return(repo); }
protected EFCoreUnitOfWork(IServiceProvider serviceProvider, ISqlDbSession sqlDbSession) : base(serviceProvider, sqlDbSession) { }
public SqlUnitOfWork(IServiceProvider serviceProvider, ISqlDbSession sqlDbSession) : base(serviceProvider, sqlDbSession) { }
public TRepo Use <TRepo>(ISqlDbSession dbSession) where TRepo : ISqlRepo => base.Create <TRepo>(dbSession);