【问题标题】:Decorating interfaces of different lifestyles装饰不同生活方式的界面
【发布时间】:2012-12-27 21:40:58
【问题描述】:

我使用 Simple Injector 作为我的 IoC 容器。 SimpleInjector 使用this simple technique to handle mixed life style for Per Thread and 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;
});

我希望用UnitOfWorkAuthoriseDecoratorUnitOfWorkExceptionDecoratorUnitOfWorkTraceDecorator等类来装饰接口IUnitOfWork。 我应该装饰什么?

  • IUnitOfWork
  • IWebUnitOfWork & IThreadUnitOfWork
  • IUnitOfWork & IWebUnitOfWork & IThreadUnitOfWork
  • UnitOfWork
  • 别的东西

【问题讨论】:

  • 顺便说一句,您确定您在正确的抽象级别进行拦截/装饰吗?装修一个工作单元是不是觉得很不寻常?

标签: c# dependency-injection simple-injector


【解决方案1】:

装饰IUnitOfWork 实例对我来说似乎是最直观的:

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

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

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

装饰其他任何东西可能会相当尴尬,因为在装饰多个接口时,您需要每个接口都有一个装饰器(在您的情况下,每个接口需要 3 个装饰器)。

装饰UnitOfWork 类是可能的,但可能非常不方便,因为您必须将此类的所有成员设为虚拟并在装饰器中覆盖它们,因为这些装饰器需要从UnitOfWork 继承。

【讨论】:

  • 谢谢 Steven,我正在寻找装饰 IUnitOfWork 是否足够的确认,因为在我看来它是最整洁的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 2021-11-24
  • 2010-09-16
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多