Dependency injection 在Windsor中注册组件而不指定接口可以吗?

Dependency 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>()

在Windsor中注册组件而不指定接口是否被视为不良形式?i、 e

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())