1
8
我一直认为用一个(虚构的)例子来解释这件事比较容易… 假设您有一个icustomerepository接口、一个ishoppingcartpository接口和一个icheckout接口。您有这些接口的具体实现——customerrepository、shoppingcartreository和checkoutservice。 您的checkoutServiceConcrete类有一个构造函数,该构造函数接受ICustomerRepository和IShoppingCartPository,例如
然后,当您希望ICheckOutService实现进行一些工作时,您可以告诉IOC容器它应该为每个接口类型使用哪个具体类,并要求它为您构建一个ICheckOutService。您的IOC容器将为您构建类,并将正确的具体类注入到您的checkoutService的构造函数中。它还将在这里沿着类继承关系一直构建依赖关系,因此,例如,如果ShoppingCartRepository在构造函数中采用IDatabaseSession接口,则IOC容器也将注入该依赖关系,只要您告诉它要为IDatabaseService使用哪个具体类。 下面是一些您在配置时可能使用的代码(例如) StructureMap 作为IOC容器(此代码通常在应用程序启动期间调用):
然后,为了获得一个已构建并准备好的ICheckOutService实例,并将所有依赖项传递给您的构造函数,您将使用如下内容:
我希望这是有道理的! |
2
1
您的IOC容器必须从具体类型构造一个对象,即使您传递的是一个接口。构造函数不是行为或状态协定,因此它不属于接口或抽象类的公共成员。 构造函数是一个实现细节,因此不需要将其定义与具体类分离。 |
3
0
不能在接口中定义构造函数签名。这无论如何都没有意义,因为接口不应该强制实现的构造方式。 不过,抽象类确实可以有构造函数。它们必须受到保护,因为公共构造函数也没有意义。它们只能由具体的子类调用。 IOC原则规定,不要让类A知道并实例化类B,而是应该将对ib的引用传递给a的构造函数。这样,a就不需要知道类B,因此您可以很容易地用一些其他的ib实现来替换类B。 因为您传递的是已经实例化的类B对象,所以ib接口不需要有构造函数签名。 |
timurichk · 我的类不重写抽象方法compareTo 6 年前 |
Steffn · angular 4中抽象类的动态多提供程序 6 年前 |
Fabio Piunti · Abstract类子类的调用方法 6 年前 |
Sunny Deshmukh · 可以从Java中的多个抽象类继承吗? 6 年前 |
Felix · 初始化抽象类的一般变量 7 年前 |
wheeeee · Scala对象扩展了抽象类/特征,访问伴随类字段 7 年前 |