我有一个 Product
对象的扩展类。
有没有什么方法可以注入(inject)我需要的服务类而不将它们作为方法参数传递?
public static class ProductExtensionMethods
{
public static void CalculatePrice(this Product product,
ICalculateProductPriceService _calculatePriceService,
IUnitOfWork _unitOfWork)
{
// Can I inject the unitOfWork and Service without
// passing them as parameters?
product.Price = _calculatePriceService.Calculate();
_unitOfWork.Commit();
}
}
最佳答案
您不能对任何 DI 容器 afaik 执行此操作,因为尽管您可以在静态类上定义构造函数,但该构造函数必须是无参数的。
我认为这对您有用的唯一方法是
在 Product 实例上定义 CalculatePrice,但实例函数只是通过对静态方法的调用传递。通过构造函数将依赖项注入(inject)实例,并通过实例调用中的静态调用传递它们。
创建一个执行相同操作的“帮助程序”类(例如 ProductPriceHelper)并在其上实现设置或初始化方法以获取依赖项,但您仍然不能*为您自动注入(inject) DI - 你必须在你的 composition rot 中的某个地方手动完成它(即你当前在任何地方进行所有 Ninject 绑定(bind))。
secret 之门 #3:我倾向于重新安排您的价格计算方式;我会谦虚地建议您的
ICalculateProductPriceService
应该有一个方法来接受 Product 实例并在其中执行其魔力。然后,ICalculateProductPriceService
依赖项在构造期间注入(inject)到 Product 中,您调用方法Product.GetPrice()
,该方法调用ICalculateProductPriceService.Calculate(this)
...如果您不能或不会在 ctor 期间注入(inject)服务(例如,如果它是一个 EF 实体等),那么您可以将其作为对 GetPrice 的必需参数依赖项。
我意识到,说到这里,毫无疑问有人会想出一个技术上优秀的解决方法来实现这一点,但它永远是一个 hack...
关于c# - Ninject:注入(inject)内部扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713116/