Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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# 模型和实例类分离_C# - Fatal编程技术网

C# 模型和实例类分离

C# 模型和实例类分离,c#,C#,你是否应该将一个类分成不同的部分,假设其中有共同的值,或者有反对它的理由 例如: public class Car { public string ModelName { get; } public string Class { get; } public string Engine { get; } public Color CarColor { get; } public uint Mileage { get; } public uint I

你是否应该将一个类分成不同的部分,假设其中有共同的值,或者有反对它的理由

例如:

public class Car
{
    public string ModelName { get; }
    public string Class { get; }
    public string Engine { get; }

    public Color CarColor { get; }
    public uint Mileage { get; }
    public uint IssueYear { get; }
}
可分为:

public class CarModel
{
    public string Name { get; }
    public string Class { get; }
    public string Engine { get; }
}


public class CarInstance
{
    private CarModel _car_model;
    public string ModelName { get => _car_model.Name; }
    public string Class { get => _car_model.Class; }
    public string Engine { get => _car_model.Engine; }

    public Color CarColor { get; }
    public uint Mileage { get; }
    public uint IssueYear { get; }
}

在您的示例中,分离将是一个不错的选择。你可以使用


在您的示例中,分离将是一个不错的选择。你可以使用


我知道你在找什么了。这类似于
产品
产品类型
关系在电子商务平台上的工作方式。根据我的经验,虽然从技术上讲,您可以像isidat的回答所显示的那样通过继承实现相同的功能,但它并不能准确地表示数据在关系数据库中的存在方式

但是,您给出的示例过于复杂。如果希望CarModel信息为只读,只需在
CarInstance
中将其属性设置为
readonly
,如下所示:

public class CarModel
{
    public string Name { get; }
    public string Class { get; }
    public string Engine { get; }
}

public class CarInstance
{
    public readonly CarModel CarModel;
    public uint Mileage { get; }
    public uint IssueYear { get; }
}
必须在构建过程中提供CarModel,但这不是问题,因为在构建
CarInstance
时,您不应该不知道它将是哪个
CarModel


然而,我想指出的是,在现实中,汽车跟踪系统的颗粒度甚至比这里的还要高
Engine
将是一个类,
class
将是一个类,甚至
PaintJob
将是一个类。基本上,任何可以在car实例之间重用的元素都是它们自己的类,以及数据库中它们自己的关系表。

我知道您现在在寻找什么。这类似于
产品
产品类型
关系在电子商务平台上的工作方式。根据我的经验,虽然从技术上讲,您可以像isidat的回答所显示的那样通过继承实现相同的功能,但它并不能准确地表示数据在关系数据库中的存在方式

但是,您给出的示例过于复杂。如果希望CarModel信息为只读,只需在
CarInstance
中将其属性设置为
readonly
,如下所示:

public class CarModel
{
    public string Name { get; }
    public string Class { get; }
    public string Engine { get; }
}

public class CarInstance
{
    public readonly CarModel CarModel;
    public uint Mileage { get; }
    public uint IssueYear { get; }
}
必须在构建过程中提供CarModel,但这不是问题,因为在构建
CarInstance
时,您不应该不知道它将是哪个
CarModel


然而,我想指出的是,在现实中,汽车跟踪系统的颗粒度甚至比这里的还要高
Engine
将是一个类,
class
将是一个类,甚至
PaintJob
将是一个类。基本上,任何可以在car实例之间重用的元素都是它们自己的类,以及数据库中它们自己的关系表。

我想我现在明白了您的要求。首先,这是一个非常广泛的问题,而且非常固执己见。但我会尽量简短地回答。因为我遵循DDD(域驱动设计),所以这种方法很大程度上依赖于
边界上下文

您可以在此处阅读有关边界上下文的内容

如果您的边界上下文仅涉及
汽车
,并且仅涉及汽车的品牌、型号或年份,您可以使用如下结构-

public class CarInstance
{
    public string Name { get; }
    public string Class { get; }
    public string Engine { get; }
}
public class CarMake
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
    public string PenaltyOffset{ get; }
}

public class CarModel
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
    public string PenaltyOffset{ get; }
    public CarMake Make { get; } //since model is dependent on Make. For example BMW models are not same as Toyota models.
}

public class CarYear
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
}

public class CarInstance
{
    public string RegistrationNumber { get; }
    public CarModel Model { get; }
    public CarYear Year{ get; }
}
因为您将只在汽车上使用这些值;不是独立的。在此范围内,这些项目的细节无关紧要。这种系统的一个例子是——如果你正在为一个家庭建立一个资产管理系统,并且只关心汽车的价值

<>但是,考虑不同的边界上下文。比如说,一家保险公司,根据汽车型号、品牌和年份投保。对于这种边界环境,了解模型、品牌和年份非常重要。因为基于这些因素,你的保险费会发生变化。现在,您需要深入了解上下文,示例模型可能如下所示-

public class CarInstance
{
    public string Name { get; }
    public string Class { get; }
    public string Engine { get; }
}
public class CarMake
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
    public string PenaltyOffset{ get; }
}

public class CarModel
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
    public string PenaltyOffset{ get; }
    public CarMake Make { get; } //since model is dependent on Make. For example BMW models are not same as Toyota models.
}

public class CarYear
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
}

public class CarInstance
{
    public string RegistrationNumber { get; }
    public CarModel Model { get; }
    public CarYear Year{ get; }
}
正如你所见,这在很大程度上取决于你在建设什么

建议-


试着理解好你的边界上下文。你会发现自己需要什么。

我想我现在明白你的要求了。首先,这是一个非常广泛的问题,而且非常固执己见。但我会尽量简短地回答。因为我遵循DDD(域驱动设计),所以这种方法很大程度上依赖于
边界上下文

您可以在此处阅读有关边界上下文的内容

如果您的边界上下文仅涉及
汽车
,并且仅涉及汽车的品牌、型号或年份,您可以使用如下结构-

public class CarInstance
{
    public string Name { get; }
    public string Class { get; }
    public string Engine { get; }
}
public class CarMake
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
    public string PenaltyOffset{ get; }
}

public class CarModel
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
    public string PenaltyOffset{ get; }
    public CarMake Make { get; } //since model is dependent on Make. For example BMW models are not same as Toyota models.
}

public class CarYear
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
}

public class CarInstance
{
    public string RegistrationNumber { get; }
    public CarModel Model { get; }
    public CarYear Year{ get; }
}
因为您将只在汽车上使用这些值;不是独立的。在此范围内,这些项目的细节无关紧要。这种系统的一个例子是——如果你正在为一个家庭建立一个资产管理系统,并且只关心汽车的价值

<>但是,考虑不同的边界上下文。比如说,一家保险公司,根据汽车型号、品牌和年份投保。对于这种边界环境,了解模型、品牌和年份非常重要。因为基于这些因素,你的保险费会发生变化。现在,您需要深入了解上下文,示例模型可能如下所示-

public class CarInstance
{
    public string Name { get; }
    public string Class { get; }
    public string Engine { get; }
}
public class CarMake
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
    public string PenaltyOffset{ get; }
}

public class CarModel
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
    public string PenaltyOffset{ get; }
    public CarMake Make { get; } //since model is dependent on Make. For example BMW models are not same as Toyota models.
}

public class CarYear
{
    public string Name { get; }
    public string PriceMultiplier{ get; }
}

public class CarInstance
{
    public string RegistrationNumber { get; }
    public CarModel Model { get; }
    public CarYear Year{ get; }
}
正如你所见,这在很大程度上取决于你在建设什么

建议-


试着理解好你的边界上下文。您将发现自己需要什么。

作为示例创建的实例类只是模型类,其中包含一些业务逻辑。您是否在问业务逻辑是否应该与模型分开?如果是这样的话,那是一个完全不同的问题。实例类是什么意思?这是我第一次听到这个词。@Logarr这些类里面没有任何逻辑,所以这不是我的意思(可能)@brainlesscoder我不知道怎么称呼这个东西我