如何在Autofac和Ninject中使用合成模式进行装饰

时间:2015-08-11 17:02:56

标签: ninject decorator autofac ioc-container composition

我想为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在某些情况下会调用主服务器和从服务器,在某些情况下只调用主服务器。

我已经使用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界面中解决这两种情况。

1 个答案:

答案 0 :(得分: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));