如何将 DbContext 注入 NRules class 构造函数?
How to inject DbContext into NRules class constructor?
我正在使用 NRules 定义规则并尝试在 NRules 基础 class 中使用接口,但出现问题,我收到 "No parameterless constructor defined for this object" 错误。
这是我的接口定义
{
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();
}
}
}
N规则Class
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 上的 Rule Dependency 所示。
因此,您的 class 应该如下所示:
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));
}
}
我正在使用 NRules 定义规则并尝试在 NRules 基础 class 中使用接口,但出现问题,我收到 "No parameterless constructor defined for this object" 错误。 这是我的接口定义
{
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();
}
}
}
N规则Class
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 上的 Rule Dependency 所示。
因此,您的 class 应该如下所示:
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));
}
}