c# - Ninject:注入(inject)内部扩展方法

标签 c# dependency-injection ninject extension-methods

我有一个 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/

相关文章:

c# - Xamarin 依赖服务问题

php - 疙瘩和动态构造函数注入(inject)

c# - Ninject 'Get'方法可以缓存值吗?

c# - UWP 应用上传失败 Microsoft store

c# - Azure Custom Vision是否可以分析视频流并计算车辆的车轮数

c# - 检测到自引用循环

c# - 这个图案有名字吗

java - Dagger 2 单例不工作

.net - 为什么我不能用 Ninjects ConstructorArgument 注入(inject) null 值?

c# - Ninject - 静态类中的内核?