Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于特性值使用不同特性时使用factory模式_C#_Asp.net Web Api2 - Fatal编程技术网

C# 基于特性值使用不同特性时使用factory模式

C# 基于特性值使用不同特性时使用factory模式,c#,asp.net-web-api2,C#,Asp.net Web Api2,在WebAPI2项目中,我有一个模型OrderLine(订单模型的嵌套对象)。客户可以发布数据,并通过IValidatableObjectI验证我的模型。简单地说,我的模型如下所示: public class Order { public int ID { get; set; } public string Description { get; set; } public ICollection<OrderLine> orderLines { get; set

在WebAPI2项目中,我有一个模型OrderLine(订单模型的嵌套对象)。客户可以发布数据,并通过
IValidatableObject
I验证我的模型。简单地说,我的模型如下所示:

public class Order {
    public int ID { get; set; }
    public string Description { get; set; }
    public ICollection<OrderLine> orderLines { get; set; }
}

public class OrderLine : IValidatableObject
{
    public int ID { get; set; }

    public string Type { get; set; }

    [Required]
    public string ItemCode { get; set; }

    [Required]
    public string Description { get; set; }

    [RequiredIf("Type == 'A'")]
    public string DeliveryType { get; set; }

    public IENumerable<ValidationResult> Validate(ValidationContext      validationContext)
    {
        if(Type.ToUpper() == "A")
        {
            var item = ItemCode + DeliveryType;

            using(MyDbContext db = new MyDbContext))
            {
                var items = db.Items.Where(q => q.ItemCode == item.ToString()).SingleOrDefault();
                if(items == null)
                {
                    yield return new ValidationResult("The conbination of ItemCode and ConfactionType is not allowed");
                }
            }
        }

        if(Type.ToUpper() == "B")
        {
            using(MyDbContext db = new MyDbContext))
            {
                var items = db.Items.Where(q => q.ItemCode == item.ToString()).SingleOrDefault();
                if(items == null)
                {
                    yield return new ValidationResult("The field ItemCode does not contain a valid code");
                }
            }
        }
    }
}
public class OrderLineA : OrderLine
{
    // some properties
    // some validation rules
}

public class OrderLineB : OrderLine
{
    // some (other) properties
    // some (other) validation rules
}

所以你想验证orderlineA和orderlineB,对吗?我可以提出一个不会遵循工厂模式的解决方案。我用这种方法尝试了,但没有成功。ICollection只填充了OrderLine的属性,尽管我在其中发送了OrderLineA的属性。OrderLineA的属性被忽略了。我认为这就是我们所说的DTO,在一个名为OrderLineDTO的DTO中拥有所有属性(OrderLineA+OrderLineB的属性)。然后基于OrderLine。键入创建OrderLineX对象。关于OrderLineX属性的验证,请调用OrderLineDTO上的validate方法,并使用switch case仅验证OrderLineA或OrderLineB属性。@singsuyash因此,基本上,我有一个OrderLine对象,它通过我的web api 2控制器公开给客户端:public IActionResult Post(Order Order)其中OrderLine是嵌套对象。然后创建一个新的OrderLineDto实例,并像我在OrderLine上首先描述的那样进行验证。当值通过验证时,将dto提供给我的存储库,将OrderLineDto映射到数据行并保存数据?(使用EF,其中对象名为Data_Line Order contains OrderLine,这没关系,当客户端发布包含Order属性和OrderLine属性的json时,它们将在控制器操作中映射到对象。到目前为止,我们都很好。我的问题是,如何获取OrderLineA、OrderLineB属性的输入?我以前的评论集中在这个问题上。@singsuyash可能我的问题不太清楚,但这正是我的问题。因为我有不同类型的订单行,我想我应该用工厂模式来解决这个问题,而不是用一个具有所有属性的模型。这就是为什么我提出了订单行a/B的想法。