Как написать метод для получения хранилища определенного типа из единицы работы - PullRequest
0 голосов
/ 18 ноября 2011

Привет, может кто-нибудь сказать мне, как вы могли бы написать метод для получения хранилища определенного типа из единицы работы?

Итак, моя единица работы:

public class UnitOfWork : IUnitOfWork, IDisposable
    {
        private Context context = new Context();
        private VectorCheckRepository<Invoice> _invoiceRepository;
        private VectorCheckRepository<InvoiceLine> _invoiceLineRepository;

        public virtual Repository<Invoice> InvoiceRepository
        {
            get
            {
                if (this._invoiceRepository == null) {
                    this._invoiceRepository = new VectorCheckRepository<Invoice>(context);
                }
                return _invoiceRepository;
            }
        }

        public virtual VectorCheckRepository<InvoiceLine> InvoiceLineRepository
        {
            get
            {
                if (this._invoiceLineRepository == null) {
                    this._invoiceLineRepository = new VectorCheckRepository<InvoiceLine>(context);
                }
                return _invoiceLineRepository;
            }
        }

        public void Save()
        {
            context.SaveChanges();
        }

        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed) {
                if (disposing) {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }

Однако во время выполнения я хочу получить хранилище из единицы работы, основанной на типе.

Так скажем, я пошел:

_unitOfWork.GetRepository (invoice);

Я хотел бы получить обратно InvoiceRepository, потому что я передал ему счет.

или:

_unitOfWork.GetRepository(invoiceLine);

Я бы хотел, чтобы он возвратил InvoiceLineRepository.

Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Не существует общего способа сделать это (за исключением некоторого уродливого медленного отражения в сочетании с соглашениями об именах = нет проверки времени компиляции и легко ломаемого решения). Я сделал это, просто создав любой метод с большим количеством if s или используя подготовленный словарь, где я получил либо целый экземпляр репозитория, основанный на типе сущности, либо тип хранилища для динамического создания.

0 голосов
/ 20 ноября 2011

Если ваша единица работы переносит ObjectContext, вы можете использовать CreateObjectSet<T>, который дает вам источник данных для вашего хранилища для переноса.

Например:

public class SqlRepository<T> : IRepository<T>
                                 where T : class, IEntity {

    public SqlRepository(ObjectContext context) {
           _objectSet = context.CreateObjectSet<T>();
    }

    protected ObjectSet<T> _objectSet;
    // ....
}

Вы можете увидеть пример в этом проекте MVC3: http://dl.dropbox.com/u/13430676/employeetimecards.zip

Код сопровождает статью о тестируемости EF с использованием UoW и репозиториев: http://msdn.microsoft.com/en-us/library/ff714955.aspx

Надеюсь, это поможет,

...