我一直认为用(编造的)例子更容易解释......
假设您有一个 ICustomerRepository 接口、一个 IShoppingCartRepository 接口和一个 ICheckout 接口。您有这些接口的具体实现 - CustomerRepository、ShoppingCartRepository 和 CheckoutService。
您的 CheckoutService 具体类有一个构造函数,它接受一个 ICustomerRepository 和一个 IShoppingCartRepository - 例如
public CheckoutService(ICustomerRepository customerRepository, IShoppingCartRepository shoppingCartRepository)
{
// Set fields for use in some methods later...
_customerRepository = customerRepository;
_shoppingCartRepository = shoppingCartRepository;
}
然后,当您想要一个 ICheckoutService 实现来做一些工作时,您告诉您的 IoC 容器它应该为每种接口类型使用哪个具体类,并要求它为您构建一个 ICheckoutService。您的 IoC 容器将为您构建类,将正确的具体类注入到 CheckoutService 的构造函数中。它还将在此处的类层次结构中一直构建依赖关系,因此,例如,如果您的 ShoppingCartRepository 在构造函数中采用 IDatabaseSession 接口,那么您的 IoC 容器也会注入该依赖关系,只要您告诉它要使用哪个具体类为您的 IDatabaseService。
以下是您在配置(例如)StructureMap作为您的 IoC 容器时可能使用的一些代码(此代码通常在应用程序启动期间调用):
public class AppRegistry : Registry
{
public AppRegistry()
{
ForRequestedType<ICheckoutService>().TheDefaultIsConcreteType<CheckoutService>();
ForRequestedType<ICustomerRepository>().TheDefaultIsConcreteType<CustomerRepository>();
// etc...
}
}
然后,要建立一个 ICheckoutService 实例并准备好使用,并将所有依赖项传递给您的构造函数,您将使用如下内容:
var checkoutService = ObjectFactory.GetInstance<ICheckoutService>();
我希望这是有道理的!