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);
        }
Пример #2
0
        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)
 {
 }
Пример #4
0
 public SqlUnitOfWork(IServiceProvider serviceProvider, ISqlDbSession sqlDbSession) : base(serviceProvider, sqlDbSession)
 {
 }
Пример #5
0
 public TRepo Use <TRepo>(ISqlDbSession dbSession) where TRepo : ISqlRepo => base.Create <TRepo>(dbSession);