Как указывалось в предыдущем посте, вы должны идти «путем интерфейса».Я лично не внедряю репозиторий непосредственно для каждой формы, но я использую небольшой вариант.Используя ваш пример ...
public interface IAccountRepository
{
Account Get(int id);
void Delete(int id);
...other method...
}
, вы создаете свой репозиторий
public class AccountRepository : IAccountRepository
{
private readonly IUnitofWork unitofWork;
public AccountRepository(IUnitofWork unitofWork)
{
this.unitofWork = unitofWork;
}
//Implement interface method
public Account Get(int id)
{
//some logic or just the call to the unit of work
return unitofWork.Get(id);
}
}
Я доволен этим решением, потому что в итоге я получаю только один репозиторий, который используется в 90% случаев.linq для запроса, поэтому мне не нужно писать sql для каждой единицы работы, и каждый раз, когда мне нужно написать «GetAllProducts» с подкачкой страниц, мне не нужно писать один и тот же код (и тесты) для каждой единицы работы,но только для моего хранилища.Это простой пример, очевидно, поэтому я надеюсь, что вы поняли идею.Вы можете создать RepositoryBase, который реализует метод Find () или Query (), который использует linq.Затем с вашим Виндзорским замком или кем-то еще, или как вы можете ввести ту единицу работы, которую вы предпочитаете.Надеюсь, это поможет.
Обновление: пример моего UnitofWorkBase, реализующего nhibernate, выглядит примерно так:
public class NHUnitofWork<T> : IUnitofWork<T> where T : EntityBase
{
protected INHSessionBuilder SessionBuilder { get; private set; }
public NHPersistorBase(INHSessionBuilder sessionBuilder)
{
SessionBuilder = sessionBuilder;
}
public T Get(int id)
{
T result = null;
ISession session = SessionBuilder.GetSession();
using (ITransaction transaction = session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
try
{
result = (T)session.Get(typeof(T), id);
transaction.Commit();
}
finally
{
if (transaction.IsActive)
transaction.Rollback();
}
}
return result;
}
public IQueryable<T> Find()
{
return SessionBuilder.GetSession().Query<T>();
}
}