Есть ли какая-то польза от использования одного экземпляра репозитория для приложения Asp.net Mvc? - PullRequest
4 голосов
/ 11 июня 2009

В Проект CarTrackr . Используется метод, который создает только 1 экземпляр хранилища для всех запросов на веб-сайте Asp.net Mvc и использует класс UnityControllerFactory для управления всеми экземплярами хранилища (отправка на запрошенный контроллер).

Есть ли какая-либо польза от использования одного экземпляра репозитория при сравнении с созданием нового экземпляра репозитория при каждом запросе?

Я знаю, это может улучшить общую производительность. Но это вызывает какие-либо проблемы с транскатацией?

частичный Global.asax

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
        RegisterDependencies();
    }

    protected static void RegisterDependencies() {
        IUnityContainer container = new UnityContainer();

        // Registrations
        container.RegisterType<IUserRepository, UserRepository>(new ContextLifetimeManager<IUserRepository>());
        container.RegisterType<ICarRepository, CarRepository>(new ContextLifetimeManager<ICarRepository>());

        // Set controller factory
        ControllerBuilder.Current.SetControllerFactory(
            new UnityControllerFactory(container)    
        );
    }
}

частичный CarController.cs

[Authorize]
public class CarController : Controller
{
    private IUserRepository UserRepository;
    private ICarRepository CarRepository;

    public CarController(IUserRepository userRepository, ICarRepository carRepository)
    {
        UserRepository = userRepository;
        CarRepository = carRepository;
    }
}

Спасибо

Ответы [ 3 ]

3 голосов
/ 20 июня 2009

Создание экземпляра репозитория для каждого запроса само по себе не должно вызывать проблем с производительностью; репозиторий часто довольно неглубокий, и когда ему необходим доступ к данным, такие как пул соединений, минимизируют стоимость установления фактических соединений. Создание объекта удивительно дешево, особенно для таких недолговечных вещей, как веб-запросы, когда объект собирается, пока он находится в «нулевом поколении».

Относительно того, иметь ли один репозиторий или репозиторий на экземпляр - это зависит от репозитория; -p

Самый большой вопрос: безопасна ли ваша ветка хранилища? Если нет: по одному на запрос.

Даже если это так; если ваш репозиторий сам хранит что-то вроде LINQ-to-SQL DataContext (который вы каким-либо образом синхронизируете), то у вас большие проблемы, если вы сохраняете это в долгосрочной перспективе, в частности, с менеджером идентификации. Вы быстро будете использовать много памяти и , чтобы получить устаревшие результаты. Далекая форма идеала.

С одним экземпляром репозитория вы, вероятно, также столкнетесь с большим количеством блокировок, пытаясь обеспечить безопасность потоков. Это может уменьшить пропускную способность. И наоборот, сама база данных имеет хорошие способы достижения гранулярных блокировок - что особенно полезно, если учесть, что часто параллельные запросы будут рассматриваться в отдельных таблицах и т. Д., Поэтому не нужно блокировать на уровне базы данных. Это было бы очень трудно сделать только на уровне хранилища - так что вам, вероятно, пришлось бы синхронизировать всю "выборку" - очень плохо.

IMO, в большинстве случаев по одному на запрос. Если вы хотите кэшировать данные, делайте это отдельно - т.е. не напрямую в экземпляре хранилища.

2 голосов
/ 20 июня 2009

Я думаю, вы не понимаете, что происходит с ContextLifeTimeManager . Передавая менеджер в метод Register (), вы даете Unity указание установить область кэширования для вашего экземпляра репозитория на HttpContext.

На самом деле неправильно говорить:

Используется некий метод, который создает только 1 экземпляр репозитория для всех запросов в Asp.net> веб-сайт Mvc

Нет синглтона хранилища. Unity создает один для каждого запроса. Похоже, это действительно ваше желаемое поведение.

Когда для области менеджера установлено значение HttpContext, контейнер ищет в HttpContext существующий экземпляр запрошенного типа (в данном случае, ваш репозиторий). Поскольку HttpContext обновляется при каждом запросе, у контейнера не будет этого экземпляра, поэтому будет создан новый.

Когда вы спрашиваете:

Есть ли польза от использования одного экземпляр хранилища при сравнении с создание нового экземпляра репозитория каждый просить?

номер

Что касается проблем с транзакциями: многопоточность определит проблему. Похоже, что CarRepository использует Linq2Sql или Linq2Entities. Его ctor требует активного datacontext. DataContext НЕ является потокобезопасным. Если текстовый текст данных хранится в области, превышающей текущий запрос, будут проблемы.

0 голосов
/ 17 июня 2009

Используя новый ContextLifetimeManager ()); время жизни репозитория ограничено одним запросом. Это означает, что каждый запрос на каждый репозиторий создается (при необходимости) и уничтожается после отправки ответа клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...