【问题标题】:How to do decorator with composition pattern in Autofac and Ninject如何在 Autofac 和 Ninject 中使用组合模式做装饰器
【发布时间】:2015-08-11 17:02:55
【问题描述】:

我想为IRepository 做一个“装饰器”。这个装饰器也是多个IRepository's 的“组合”。在代码中:

public interface IRepository { }
public class RepositoryFoo : IRepository { }
public class RepositoryBar : IRepository { }
public class RepositoryDuh : IRepository { }

public class RepositoryComposition : IRepository
{
  public RepositoryComposition(IRepository master, IEnumerable<IRepository> slaves) { }
}

RepositoryComposition 在某些情况下会同时调用 master 和 slave,在某些情况下只调用 master。

我已将此设置与 Autofac 和 Ninject 一起使用,但我认为 Ninject 解决方案不太好。所以问题是,这可以做得更好吗?怎么做?

这是我的 Autofac 解决方案:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<RepositoryFoo>().Named<IRepository>("master");
builder.RegisterType<RepositoryBar>().Named<IRepository>("slave");
builder.RegisterType<RepositoryDuh>().Named<IRepository>("slave");

builder.Register<IRepository>(f => new RepositoryComposition(
  f.ResolveNamed<IRepository>("master"), 
  f.ResolveNamed<IEnumerable<IRepository>>("slave"))
);

这是我的 Ninject 解决方案:

Bind<RepositoryFoo>().ToSelf();
Bind<RepositoryBar>().ToSelf();
Bind<RepositoryDuh>().ToSelf();
Bind<IRepository>().To<RepositoryComposition>().
  WithConstructorArgument("somethings", f => f.Kernel.Get<RepositoryFoo>()).
  WithConstructorArgument("slaves", f => new IRepository[] { 
    f.Kernel.Get<RepositoryBar>(), 
    f.Kernel.Get<RepositoryDuh>() 
});

我将在IRepository 接口中解决这两种情况。

【问题讨论】:

  • 首先,这不是decorator pattern。在装饰器中,您可以在运行时向对象添加额外的职责。您的RepositoryComposition 是否有某些特殊原因需要了解“主”实例与“从”实例?

标签: ninject decorator autofac ioc-container composition


【解决方案1】:

这不是一个答案,但对知道这个问题很有用:Simple Injector 注册很简单

container.Register<IRepository, RepositoryFoo>();
container.RegisterAll<IRepository>(typeof(RepositoryBar), typeof(RepositoryDuh));
container.RegisterDecorator(
    typeof(IRepository),
    typeof(RepositoryComposition), 
    context => context.ImplementationType == typeof(RepositoryFoo));

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多