Dependency injection 为具有注入服务和数据的类构造依赖注入

Dependency injection 为具有注入服务和数据的类构造依赖注入,dependency-injection,castle-windsor,ioc-container,Dependency Injection,Castle Windsor,Ioc Container,我使用的是使用构造函数注入的IoC容器(例如Castle Windsor)。我有下面的(示例)类来管理产品 public class ProductDataManager { public ProductDataManager(Product product, IProductDataLoader productDataLoader) { } // a number of methods here that manage the products data in

我使用的是使用构造函数注入的IoC容器(例如Castle Windsor)。我有下面的(示例)类来管理产品

public class ProductDataManager
{
    public ProductDataManager(Product product, IProductDataLoader productDataLoader)
    {
    }

    // a number of methods here that manage the products data in different ways...
}
它依赖于一个产品,而这个产品只有消费者知道。它还依赖于产品数据加载器服务。我在IoC容器中定义此服务的实现者

如何在IoC容器(和/或消费类)中定义此类(ProductDataManager),以便IoC容器可以注入服务依赖项(IPProductDataLoader),消费类可以传递数据依赖项(产品)?


或者这是一种代码气味?如果是这样,该如何修改呢?

您可以使用
TypedFactoryFacility
并执行类似的操作(在我的头顶上)。。。首先,为抽象工厂定义一个接口:

public interface IProductDataManagerFactory
{
    ProductDataManager Create(Product product);
}
按如下方式注册工厂:

container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IProductDataManagerFactory>().AsFactory());
container.AddFacility();
container.Register(Component.For().AsFactory());
现在,服务可以依赖于
IPProductDataManagerFactory
,并让Windsor调用
容器。通过自动实现的工厂解决


请注意,方法签名中的参数名称
product
必须与
ProductDataManager

的ctor中的参数名称相对应。您可以使用
TypedFactoryFacility
并执行类似操作(在我的头顶上)。。。首先,为抽象工厂定义一个接口:

public interface IProductDataManagerFactory
{
    ProductDataManager Create(Product product);
}
按如下方式注册工厂:

container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IProductDataManagerFactory>().AsFactory());
container.AddFacility();
container.Register(Component.For().AsFactory());
现在,服务可以依赖于
IPProductDataManagerFactory
,并让Windsor调用
容器。通过自动实现的工厂解决


请注意,方法签名中的参数名
product
必须与
ProductDataManager

的ctor中的参数名相对应。如果工厂是一个简单的new(),那么我想说,甚至不需要创建接口,注入Func也没有问题。您甚至可以使用一个奇特的工具来完成这项工作:@Mark:虽然创建
ixxFactory
更为详细,但它更为明确,使您的代码更易于工厂理解。在我看来,使用
Func
有点神秘。如果工厂是一个简单的new(),那么我会说,甚至不需要创建接口,注入Func也没有什么错。您甚至可以使用一个奇特的工具来完成这项工作:@Mark:虽然创建
ixxFactory
更为详细,但它更为明确,使您的代码更易于工厂理解。在我看来,使用
Func
有点神秘。