Я новичок в NHibernate и не очень хорош в C #, но я учусь.У меня есть класс DataProvider
, который предоставляет данные для моего приложения, использующего NHibernate 3. Он структурирован в значительной степени аналогично летнему видео Стива Болена из NHibernate .
Я заметил, что собираюсь многократно повторять код и хочу упростить мой DataProvider
.Например, у меня есть два бизнес-класса с именами Instrument
и Broker
.Метод добавления Instrument
в мой DataProvider
: 1011
public int AddInstrument(Instrument instrument)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
int newId = (int)_session.Save(instrument);
_session.Flush();
tx.Commit();
return newId;
}
catch (NHibernate.HibernateException)
{
tx.Rollback();
throw;
}
}
}
1013 * и класс
AddBroker
выглядит удивительно похожим (просто найдите и замените).Поэтому я подумал, что, возможно, смогу использовать Generics для решения проблемы.Что-то вроде:
public class DataProvider <TEntity>
{
public int AddEntity(TEntity entity)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
int newId = (int)_session.Save(entity);
_session.Flush();
tx.Commit();
return newId;
}
catch (NHibernate.HibernateException)
{
tx.Rollback();
throw;
}
}
}
}
С этим я могу передать Broker
, Instrument
или что-нибудь еще, и я сохраняю много повторяющегося кода.У меня проблема в том, что в моем Test
классе я создаю новый DataProvider
каждый раз, когда запускается тест:мой DataProvider
.Можете ли вы придумать способ решить эту проблему?Я начинающий программист, и мне интересно, иду ли я по правильному пути.Должен ли я делать что-то совершенно другое?
ОБНОВЛЕНИЕ
Я пытался реализовать ответ Груо, но у меня возникли некоторые проблемы.Вот что я сделал.
IRepo.cs
interface IRepo<T>
{
int Add<Entity>(Entity entity);
void Delete<Entity>(Entity entity);
void GetById<Entity>(int Id);
}
BaseRepo.cs
public abstract class BaseRepo <T> : IRepo <T>
{
private ISession _session;
#region SessionManagement
public BaseRepo(ISession session)
{
_session = session;
}
public ISession Session
{
set { _session = value; }
}
#endregion
public int Add<Entity>(Entity entity)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
int newId = (int)_session.Save(entity);
_session.Flush();
tx.Commit();
return newId;
}
catch (NHibernate.HibernateException)
{
tx.Rollback();
throw;
}
}
}
// other methods omitted for brevity
}
IRepoFactory.cs
interface IRepoFactory
{
IInstrumentRepo CreateInstrumentRepo(ISession s);
}
RepoFactory.cs
public class RepoFactory : IRepoFactory
{
public IInstrumentRepo CreateInstrumentRepo(ISession s) // problem here
{
return new InstrumentRepo(s);
}
}
IInstrumentRepo.cs
interface IInstrumentRepo : IRepo<Instrument>
{
}
InstrumentRepo.cs
public class InstrumentRepo : BaseRepo<Instrument>, IInstrumentRepo
{
public InstrumentRepo(ISession s) : base(s) { }
}
В RepoFactory.cs я получаю эту ошибку:
Inconsistent accessibility: return type 'MooDB.Data.IInstrumentRepo' is less accessible than method 'MooDB.Data.RepoFactory.CreateInstrumentRepo(NHibernate.ISession)'
Есть идеи, что мне не хватает?