【发布时间】: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