Dependency injection 在Windsor中注册组件而不指定接口可以吗?
在Windsor中注册组件而不指定接口是否被视为不良形式?i、 eDependency injection 在Windsor中注册组件而不指定接口可以吗?,dependency-injection,castle-windsor,ioc-container,Dependency Injection,Castle Windsor,Ioc Container,在Windsor中注册组件而不指定接口是否被视为不良形式?i、 e container.Register(Component.For<MyClass>().LifeStyle.Transient); container.Register(Component.For().lifesture.Transient); 相对于 container.Register(Component.For<IMyClass>().ImplementedBy<MyClass>()
container.Register(Component.For<MyClass>().LifeStyle.Transient);
container.Register(Component.For().lifesture.Transient);
相对于
container.Register(Component.For<IMyClass>().ImplementedBy<MyClass>().LifeStyle.Transient);
container.Register(Component.For().ImplementedBy().lifesture.Transient);
我理解编码到接口而不是具体实现的好处,但是我们发现现在有很多接口,其中许多接口都在实际上只有一个实现的类上。是的,注册没有接口的组件是可以的,但不是因为你给出的理由 具体依赖关系 组件可能依赖于具体的类。例如,对于实体框架,消费者应该将ObjectContext注入其中。这是一个仍然需要注入的具体类,因为它应该在几个消费者之间共享 因此,假设消费者的构造函数是这样的:
public FooRepository(FooObjectContext objectContext)
container.Register(Component.For<FooObjectContext>());
您需要如下配置容器:
public FooRepository(FooObjectContext objectContext)
container.Register(Component.For<FooObjectContext>());
温莎城堡解决Ploeh的唯一方法是注册IBar。即使Bar是IBar的唯一实现,这也不会起作用
container.Register(Component.For<Bar>());
container.Register(Component.For());
这不起作用,因为IBar从未注册过。Castle Windsor不在乎Bar实现IBar,因为它不想试图代表您变得聪明。你必须明确地告诉它:
container.Register(Component.For<IBar>().ImplementedBy<Bar>());
container.Register(Component.For().ImplementedBy());
该将IBar映射到Bar
同时注册接口和具体类型
那么,如果您希望能够解析具体类型和接口呢
上一个示例的问题是,它可以让您解决IBar,但不能解决Bar
您可以使用Forward方法或的多泛型重载转发注册:
container.Register(Component.For<Bar, IBar>().ImplementedBy<Bar>());
container.Register(Component.For().ImplementedBy());
这可以让您解析Bar和IBar。另一个好例子是MVC应用程序中的控制器-您不需要抽象它们。是的,MVC控制器是一个更好的例子-我只是陷入了一些EF代码中,所以我首先想到了:)谢谢Mark,但是如果我是创建Bar类的开发人员,我应该让它有一个接口IBar,这样我就可以通过接口在Windsor注册了吗?为什么不干脆在温莎注册酒吧,让Ploeh消费酒吧?这样可以避免松散耦合。如果您这样做,那么为什么要使用DI容器呢?如果存储库接受基类DbContext作为依赖项,这是可行的,但它正确吗?container.Register(Component.For().ImplementedBy().LifestylePerWebRequest())