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我不知道怎么称呼这个东西我