Пример #1
0
        /// <summary>
        /// Конструктор принимает список типов объектов для регистрации репозиториев.
        /// При попытке работать с незарегистрированным типом объектов (через <see cref="Get{TEntity}"/> или свойства-ссылки RepoXX)
        /// будет сгенерировано исключение.
        /// </summary>
        /// <param name="entityTypes">Список типов объектов</param>
        /// <exception cref="InvalidOperationException">Возникает, если не установлен провайдер данных (см. <see cref="DataAccessManager.SetDefaultService(IDataService)"/>).</exception>
        protected UnitOfWorkBase(params Type[] entityTypes)
        {
            DataAccessManager.CheckDefaultService();

            var entityTypes2 = GetPropertiesTypes();

            entityTypes2.AddRange(entityTypes);
            if (entityTypes2.Any(x => x.IsNested))
            {
                throw new InvalidOperationException("Нельзя использовать вложенные типы в качестве типов объектов.");
            }
            _context = DataAccessManager.GetDefaultService().CreateDataContext(modelAccessor => OnModelCreating(modelAccessor), entityTypes2.ToArray());
            GenerateProperties();
        }
Пример #2
0
        /// <summary>
        /// Возвращает интерфейс для работы с репозиторием указанного типа объектов <typeparamref name="TEntity"/>.
        /// Репозиторий регистрируется для указанного типа объектов <typeparamref name="TEntity"/> внутри контейнера и сохраняется до уничтожения контейнера.
        /// Тип объектов <typeparamref name="TEntity"/> должен быть типом, зарегистрированным для контекста доступа к данным (можно проверить в <see cref="IDataContext.RegisteredTypes"/>).
        /// </summary>
        /// <returns></returns>
        public IRepository <TEntity> Get <TEntity>() where TEntity : class
        {
            var type = typeof(TEntity);

            if (!_context.RegisteredTypes.Contains(type))
            {
                throw new TypeAccessException($"Тип {type.Name} не зарегистрирован в контейнере.");
            }

            var repo = _repositoryCache.GetOrAdd(
                type,
                (t) => DataAccessManager.GetDefaultService().CreateRepository <TEntity>(_context)
                );

            return((IRepository <TEntity>)repo);
        }