Общее управление сеансами репозитория asp.net-mvc fluent nhibernate

У меня возникла проблема с моим проектом. Я использую общий репозиторий со структурной картой вместе с Fluent NHibernate. Все работает неплохо, но когда дело доходит до транзакций и управления сеансами, я понятия не имею, что делать. Я искал ответы, но не могу найти ничего, что соответствовало бы моим потребностям.

Что я делаю в своем приложении, так это то, что я разрешаю структурной карте создавать экземпляр класса репозитория, когда он получает запрос на него, например:

internal class RepositoryRegistry : Registry
{
    public RepositoryRegistry()
    {
        For<IRepository<User>>().Use<Repository<User>>();
        For<IRepository<Tasks>>().Use<Repository<Tasks>>();
    }
}

internal class NHibernateRegistry : Registry
{
    public NHibernateRegistry()
    {
        For<ISessionFactory>()
            .Singleton()
            .Use(() => new NHibernateSessionFactory().GetSessionFactory());

        For<ISession>()
            .Singleton()
            .Use(x => x.GetInstance<ISessionFactory>().OpenSession());
    }
}

public interface IRepository<T>
{
    T GetById(int id);

    void SaveOrUpdate(T entity);

    IList<T> GetAll();

    IQueryable<T> Linq();

    void Add(T entity);

}

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

Спасибо, Джеймс Форд


person James Ford    schedule 24.03.2011    source источник


Ответы (1)


Я думаю, что вы ищете Unit Of Схема работы, в которой время жизни транзакции контролируется единицей работы, которую вы вводите в репостории / службы.

См. этот ответ для примера реализации UoW с NHibernate и StructureMap.

Изменить:

Если вы реализовали единицу работы и общий репозиторий, вы бы в основном использовали их:

1) Отображение их на структурной карте:

c.For(typeof(IRepository<>)).Use(typeof(Repository<>));
c.For<IUnitOfWork>().Use<UnitOfWork>();

2) Принятие Контроллером репозитория (или службы, инкапсулирующей репозиторий; этот подход часто предпочтительнее) и UnitOfWork:

public class MyController
{
  public MyController(IRepository<MyEntity> repository, IUnitOfWork uow)
  {
     _repository = repository;
     _unitOfWork = uow;
  }
}

Это, конечно, также требует наличия создал собственный ControllerFactory.

3) Использование единицы работы и репозитория в действии контроллера:

public ViewResult MyAction(MyEntity entity)
{
  _repository.Save(entity);
  _unitOfWork.Commit();
  return View();
} 
person PHeiberg    schedule 25.03.2011
comment
Да, это то, что я ищу. Я и раньше достигал пика в шаблоне единицы работы, но, похоже, не могу понять, как Till будет работать с моими общими репозиториями. - person James Ford; 26.03.2011
comment
Да, твое редактирование мне помогло. Что я сейчас придумал, так это то, что я получаю доступ к своим репозиториям через uow. Так что мне нравится только карта для ‹IUnitOfWork› (). Используйте ‹UnitOfWork› (); и позволить контроллерам получить доступ к IUnitOfWork. Затем я добавил метод public Repository ‹TEntity› RepositoryFor ‹TEntity› (), где TEntity: class, который отправит сеанс в класс репозитория, чтобы я мог получить доступ к своим репозиториям через uow. Не знаю, плохо это или нет, но работает. - person James Ford; 27.03.2011