我想为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
界面中解决这两种情况。
答案 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));