如何将 DbContext 注入 NRules 类构造函数



我正在使用 NRules 来定义规则并尝试在 NRules 基类中使用接口,但出现问题,我收到"没有为此对象定义无参数构造函数"错误。这是我的接口定义

{
    public interface ICalcDiscount
    {
        public void ApplyPoint(int point);
    }
    public class CalcDiscount:ICalcDiscount
    {
        private readonly UniContext _context;
       public CalcPoint(UniContext context)
        {
            _context = context;
        }
        public  void ApplyDiscount(int d)
        {
           _context.Discount.Add(new Discount{ CustomerId = 1, d= d});
           _context.SaveChanges();
        }
    }
}

NRule 类

 public class PreferredCustomerDiscountRule : Rule
    {
        private readonly ICalcDiscount _d;
        public PreferredCustomerDiscountRule(ICalcDiscount d)
        {
            _d = d;
        }
        public override void Define()
        {
            Book book = null;

            When()
                .Match(() => book);

            Then()
                .Do(ctx => _c.ApplyDiscount(10));
        }
    }

我在 NRules 开始加载组装时收到错误MissingMethodException:没有为此对象定义无参数构造函数。

 //Load rules
    var repository = new RuleRepository();
    repository.Load(x => x.From(typeof(PreferredCustomerDiscountRule).Assembly));//problem is here!
 //Compile rules
    var factory = repository.Compile();

正如错误所说,您不能拥有具有包含参数的构造函数的规则。

您还应该解析规则定义中的依赖关系,如 NRules wiki 上的规则依赖关系所示。

因此,您的类应如下所示:

public class PreferredCustomerDiscountRule : Rule
    {
        public override void Define()
        {
            Book book = null;
            ICalcDiscount discountService = null;
            Dependency()
                .Resolve(() => discountService);
            When()
                .Match(() => book);

            Then()
                .Do(_ => discountService.ApplyDiscount(10));
        }
    }

最新更新