Оформление интерфейсов разных стилей жизни

Я использую Simple Injector в качестве контейнера IoC. SimpleInjector использует этот простой метод для обработки смешанных стиль жизни для Per Thread и Per Web Request

container.RegisterPerWebRequest<IWebUnitOfWork, UnitOfWork>();
container.RegisterLifetimeScope<IThreadUnitOfWork, UnitOfWork>();
container.Register<IUnitOfWork>(() => container.GetInstance<UnitOfWork>());

// Register as hybrid PerWebRequest / PerLifetimeScope.
container.Register<UnitOfWork>(() =>
{
    if (HttpContext.Current != null)
        return container.GetInstance<IWebUnitOfWork>() as UnitOfWork;
    else
        return container.GetInstance<IThreadUnitOfWork>() as UnitOfWork;
});

Я хочу украсить интерфейс IUnitOfWork такими классами, как UnitOfWorkAuthoriseDecorator, UnitOfWorkExceptionDecorator и UnitOfWorkTraceDecorator. Что мне украсить?

  • IUnitOfWork
  • IWebUnitOfWork и IThreadUnitOfWork
  • IUnitOfWork и IWebUnitOfWork и IThreadUnitOfWork
  • UnitOfWork
  • что-то другое

person qujck    schedule 27.12.2012    source источник
comment
кстати, вы уверены, что перехватываете/декорируете на правильном уровне абстракции? Считаете довольно необычным украшать единицу работы?   -  person Steven    schedule 29.12.2012


Ответы (1)


Мне кажется наиболее интуитивным украсить экземпляр IUnitOfWork:

container.RegisterDecorator(typeof(IUnitOfWork),
    typeof(UnitOfWorkAuthoriseDecorator));

container.RegisterDecorator(typeof(IUnitOfWork),
    typeof(UnitOfWorkExceptionDecorator));

container.RegisterDecorator(typeof(IUnitOfWork),
    typeof(UnitOfWorkTraceDecorator));

Украшение чего-либо еще, вероятно, было бы довольно неудобным, поскольку при украшении нескольких интерфейсов вам нужно иметь декоратор для каждого интерфейса (а в вашем случае 3 декоратора для каждого интерфейса).

Декорирование класса UnitOfWork возможно, но, вероятно, очень неудобно, так как вам придется сделать всех членов этого класса виртуальными и переопределить их в декораторах, так как эти декораторы должны наследоваться от UnitOfWork.

person Steven    schedule 27.12.2012
comment
Спасибо, Стивен, я искал подтверждение того, что украшения IUnitOfWork будет достаточно, так как мне показалось, что это самый аккуратный вариант. - person qujck; 27.12.2012