расширение класса репозитория по умолчанию - PullRequest
2 голосов
/ 26 апреля 2011

Я использую шаблон репозитория с интерфейсами, и я использую Structuremap для отображения между ними.

В моем global.asax я определил:

    ObjectFactory.Initialize(x =>
        {
            x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>();
            x.For(typeof(IRepository<>)).Use(typeof(EFRepository<>)
        }
    );

Теперь я хочу добавить еще один метод БД в сущность MyEntity.Поэтому я создал MyEntityRepository:

class MyEntityRepository:EFRepository<MyEntity>, IMyEntityRepository {
    public void CloseCall(long callId) {
        ....
        ....
    }
}

Но теперь я вынужден добавить новую строку для инициализации структуры карты.У меня много таких случаев, и количество строк в инициализации структуры карты становится все больше и больше.

Кроме того, в большинстве случаев это только добавление одного метода, но это добавление одного метода требует интерфейса для нового репозитория, реализации в новом файле и другой инициализации структуры карты - много работы для одного метода.

Как я могу решить это?

Я что-то не так делаю?

Может быть, лучше использовать метод расширения для репозитория (если есть такое расширение для универсального ..)?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

В моем бизнес-уровне - где я определил интерфейс IRepository, который я создал:

public abstract class BaseRepository<T> : IRepository<T> where T : IDataEntity
{
    protected IRepository<T> Repository { get; set; }

    public BaseRepository()
    {
        Repository = ObjectFactory.GetInstance<IRepository<T>>();
    }

    public virtual IQueryable<T> GetQuery()
    {
        return Repository.GetQuery();
    }

    public virtual IQueryable<T> GetQuery(params Expression<Func<T, object>>[] includes)
    {
        return Repository.GetQuery(includes);
    }

    public virtual void Insert(T entity)
    {
        Repository.Insert(entity);
    }

    public virtual void Update(T entity)
    {
        Repository.Update(entity);
    }

    public virtual void Delete(T entity)
    {
        Repository.Delete(entity);
    }

    public virtual void Attach(T entity)
    {
        Repository.Attach(entity);
    }
}

В global.asax мне нужно сопоставить IRepository с реализацией платформы сущностей.
А теперь длякаждый класс, который я хочу представить в Интернете, я должен определить:

public class MyEntityRepository: BaseRepository<MyEntity> {
    ....
    Common queries for this entity
    ....
    ....
    overrides of insert, delete and so on
}

Теперь я вообще не могу использовать BaseRepository в веб-приложении, но использую репозиторий, принадлежащий сущности.Мне также не нужно регистрировать каждое расширение репозитория в Structuremap.Единственное, что я должен помнить, чтобы не использовать напрямую EFRepository (я могу получить его, используя карту структуры - и я должен избегать его использования).

0 голосов
/ 26 апреля 2011

Если у вас есть специальные интерфейсы, которые должны быть разрешены со специальным типом, вы всегда должны писать код где-нибудь для инициализации этого.Если вы не хотите писать слишком много кода в инициализации StructureMap, используйте абстрактный шаблон фабрики для слоя DAL:

Интерфейс фабрики:

public interface IDalFactory
{
    IXXXRepository XXXRepository { get; }
    IYYYRepository YYYRepository { get; }
} 

Реализация:

public class DalFactory : IDalFactory
{
    private IXXXRepository _xxxRepository;
    public IXXXRepository XXXRepository
    {
        return _xxxRepository ?? (_xxxRepository = new XXXRepository());
    }

    private IYYYRepository _yyyRepository;
    public IYYYRepository YYYRepository
    {
        return _yyyRepository ?? (_yyyRepository = new YYYRepository());
    }
}

И вы инициализируете свой IoC:

ObjectFactory.Initialize(x =>
        {
            x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>();
            x.For<IDalFactory>().Use<DalFactory>();
        }
    );

Специализированный код всегда нуждается в отдельной регистрации где-то, если вы не создадите автоматическую регистрацию, которая будет искать ваши сборки с отражением и регистрировать репозитории в соответствии с некоторыми соглашениями об именах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...