условное размещение объектов с использованием DI-фреймворка (Ninject) - PullRequest
0 голосов
/ 01 марта 2012

У меня есть следующий код

public class MyService : IMyService
{
    private readonoly IUnitOfWork _unitOfWork;
    public MyService(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }
}

//This code is used by web client
private static void RegisterServices(IKernel kernel) 
{
    kernel.Bind<IMyService>().To<MyService>();
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
}

У меня есть клиент веб-службы и службы Windows, оба используют класс "MyService".Я хочу расположить «единицу работы» в конце HTTP-запроса, если клиент является веб-сервером, где, как если бы клиент был службой Windows, я хочу распоряжаться единицей работы после каждого вызова базы данных.как этого добиться?Могу ли я добавить дополнительный флаг в конструктор MyService, чтобы идентифицировать клиента, но затем как изменить вышеуказанный код, чтобы передать жестко запрограммированное значение этому параметру при сопоставлении конкретных типов с интерфейсами?

1 Ответ

0 голосов
/ 01 марта 2012

Вероятно, у вас будет какая-то MyServiceRunner в вашей службе Windows, которая вызывает ваш MyService.Этот класс специфичен для службы Windows, и это было бы местом для явного управления временем жизни IUnitOfWork.Или вы можете написать декоратор для MyService, который контролирует единицу работы.

Несколько замечаний.Хотя вы можете повторно использовать IUnitOfWork для каждого веб-запроса, НЕ ИСПОЛЬЗУЙТЕ Commit единицу работы в конце веб-запроса, но делайте это явно после успешного выполнения службы (успешно).Поскольку область действия вашего IUnitOfWork сильно отличается в службе Windows, вам, вероятно, понадобится какой-то явный код или явная регистрация, чтобы справиться с этим.Тем не менее, убедитесь, что ваш MyService не обращает на это внимания: это не должно заботить.

Если у вас есть много служб, которые вы хотите вызвать в службе Windows, вы можете подумать ошаблон команды / обработчика для обработки бизнес-логики.Подробнее об этом можно прочитать здесь .

...