删除两个类的具体依赖关系并访问公共构造函数的依赖对象

时间:2016-05-26 09:48:32

标签: c# asp.net asp.net-mvc dependency-injection castle-windsor

我是usnig windsor以消除我的依赖性我已经在代码下面进行了implimnetd但是我无法访问MEthod名称" test"上课" Foo" ..我在下面做的错误请告诉我。谢谢。

代码

$result->any

2 个答案:

答案 0 :(得分:1)

如果在IFoo接口中声明测试方法,那么你可以用IFoo引用调用测试方法(实际上是持有Foo实例)

 public interface IFoo
 {
    int test();
 }

请注意,您还必须使用测试方法的定义更新Bar,否则您的代码将无法编译

答案 1 :(得分:1)

类型Bar应该依赖于IFoo,它不关心实现接口只是给出了一个IFoo,IFoo应该包含你在Foo中定义的int test()方法,以允许IFoo的所有实现调用方法而不必知道具体的类型信息。

通过让它直接依赖于具体类型,你可能会从SOLID中破坏DIP(可能)...所述LSP告诉我们具体类型是否是抽象的我们可以声明它必须是特定的基类型并且我们期望继承那些东西,但通常在那种情况下,Foo会被标记为抽象,而IFoo可能根本不存在。

https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

很多这样的东西可以解释你想要对你的设计有多严格,一般来说,虽然在使用IoC /依赖注入时我们会设置一个标准,所有IoC构造类型通常只在可能的情况下依赖于接口允许我们的扩展点可以在以后由IoC提供商换出。

取决于你如何看待它,抽象基类型可以看作是“部分实现的界面”,天气与否,被认为是良好的做法,我认为可能是一个讨论点。

要考虑的另一件事:

当使用IoC时,我们定义了如何在堆栈中构造对象的规则,为类型的ctor传递args意味着那些args将永远传递,除非你有一个IoC容器的实例,你可以定义不同的args并且正在构建的堆栈中将您的IoC对象注释为“服务定位器反模式”的反模式谷歌。

通常,您希望不要求标量值的IoC规则仅传递具有自己的IoC规则的对象作为最佳实践。

好的设计告诉我们我们应该做的事情如下:

  • 在我们的系统/应用程序中定义组件(高级别)
  • 定义组件之间的接口及其预期行为。
  • 为接口的预期行为构建测试计划
  • 以一种或多种具体类型实施界面
  • 构建一个规则集,以选择在运行时为IoC容器选择哪种具体类型