0

У меня есть следующий кодусловное Уничтожение объектов с помощью рамки DI (Ninject)

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(); 
} 

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

ответ

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^