управление ISession в базовом контроллере ... - PullRequest
0 голосов
/ 29 июля 2011

Я избегаю внедрения в моей ISession в каждый контроллер, таким образом избегая этого: Ninject with base controller?

Я пытаюсь получить доступ к своему IRepository внутри моего базового контроллера, чтобы я могиспользовать его во всем приложении, есть ли проблемы с управлением временем жизни объекта с помощью второго метода ниже?По сути, я хочу создавать его снова каждый раз, когда он мне нужен для каждого запроса на действие ...

// Использование Ninject для инъекции ...

 private readonly IReadOnlySession _repo;
    public SimpleController(IReadOnlySession repo)
    {
        _repo = repo;
    }

// Получение из базового контроллера -> мой предпочтительный метод ...

public abstract class AbstractBaseController : Controller
{
  public AbstractBaseController() { }

 private static IReadOnlyGenericRepository readonlysession;
 public static IReadOnlyGenericRepository ReadOnlySession
 {
   get { return (readonlysession ?? (readonlysession = new ReadOnlyGenericRepository())); }
 }
}

// Затем доступ с использованием

var detail = ReadOnlySession.Single<Cat>(x=> x.CatID== _catid);

IReadOnlyGenericRepository просто наследуется от:

public interface IReadOnlySession
    {
        T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new();
        System.Linq.IQueryable<T> All<T>() where T : class, new();
    }

Обновление: объявление кода нижев моем AbstractBaseController можно выполнить модульное тестирование?

private IReadOnlySession readonlysession;
public IReadOnlySession _repo
{
   get { return (readonlysession ?? (readonlysession = GetReadOnlySession())); }
}

protected virtual IReadOnlySession GetReadOnlySession()
{
  return new ReadOnlyGenericRepository();
}

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Вы также вводите фиксированную зависимость для ReadOnlyGenericRepository. И я считаю, что юнит-тесты и их реализация будут гораздо менее понятны / читабельны. Лично я думаю, что это решение дает вам больше и худшие отрицательные моменты, чем то, что вы выигрываете, не добавляя ни одного параметра конструктора (что в любом случае выполняется простым Alt-Enter в Resharper).

Positive:

  • Не требуется аргумент конструктора (или сказать иначе: сохраняет один удар Alt-Enter в Resharper)

Отрицательный:

  • Исправить зависимость от ReadOnlyGenericRepository
  • Требуется переопределение тестового класса GetReadOnlySession() для каждого контроллера
  • Менее понятные юнит-тесты и реализация

Также подумайте об агрегации, а не о наследовании, если вам нужно передать еще один базовый конструктор.

1 голос
/ 29 июля 2011

Есть ли проблемы с управлением временем жизни объекта с помощью второго метода, описанного ниже?

Модульное тестирование ваших контроллеров в изоляции может быть немного сложным с этим статическим объектом в базеконтроллер.Кроме того, я не знаю, что это IReadOnlySession должно представлять, но поскольку он статический, он будет распределен среди всех пользователей => всех запросов, поэтому вы должны убедиться, что он потокобезопасен, ... Лично я предпочитаюподход репозитория, который вводится в контроллеры через структуру DI.

...