使用继承自不同程序集 Class 的模型的代码优先方法
Code First Approach with Model Inherited From Class In Different Assembly
我有一个分为两个项目的解决方案:一个包含我所有模型 class 的 class 库(我们称之为 Business),以及ASP.Net MVC 项目。
My Business classes 是通用的,适用于多种类型的项目。因此,它们不包含任何 数据注释/与其他 class 的关联 ,仅包含 成员变量/属性/构造函数.
使用代码优先方法,我应该如何设计我的 ASP.Net 模型以与我的 业务 模型一起工作。
我最初的教学是将我的 Business classes 设置为部分 classes,然后通过添加必要的 覆盖我的属性数据注释/关联。我不能那样做,因为我们正在处理两个不同的项目。
我也在想我可以使用继承。我的 ASP.Net 模型可以从业务 classes 继承,我可以在那。这看起来有点混乱和不合逻辑,因为我需要在这个新的 subclass.
中定义我所有的构造函数
有没有一种聪明的方法可以干净地做到这一点?
编辑:
我的业务 classes 通过在 属性 setter 中抛出异常来进行验证。我的第一个设计是创建我自己的自定义 数据注释 ,它将捕获我的 setter 抛出的异常:
public class SetterBasedValidation : ValidationAttribute
{
string m_errorMessage = null;
public SetterBasedValidation(string errorMessage)
{
m_errorMessage = errorMessage;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
try
{
Type type = validationContext.ObjectType;
PropertyInfo property = type.GetProperty(validationContext.MemberName);
property.SetValue(validationContext.ObjectInstance, value);
}
catch (Exception)
{
return new ValidationResult(m_errorMessage);
}
return ValidationResult.Success;
}
}
然后我需要一种方法来在我的 ASP.Net 模型 class 中使用我的自定义数据注释。这会给我想要的结果:
- 保持我的业务class是通用的
- 使用我的设置器的验证
- 使用数据注释
将同一个类用于多种用途的想法不是很好。通常,业务 类 面向(负责)业务逻辑。另一方面,视图模型,因为这通常是您 ASP.NET MVC 模型文件夹中的内容,负责支持 MVC 应用程序的视图。最后还有数据 类(有些人称它们为 DTO),它们是您的 DAL 的一部分。
所以,从头到尾你应该有 数据 类、业务 类 和最后 查看模型 ,它构成了中型到大型 Web 应用程序的绝对最小值。即使是小型应用程序也能从这些分离中受益。
现在你可以回想一下SOLID的第一个字母,也就是单一职责原则,其中规定:
A class should have only one reason to change.
(有关单一职责原则的更多信息 here。)
您要做的是为您的业务分配两个角色 类,即业务和表示、视图模型。所以,比如说,你想涵盖一些新的业务功能,那么你的视图模型肯定会受到影响。另一方面,如果您想添加一些与视图功能相关的功能(您的情况),您的业务逻辑实现可能会受到威胁。这几乎就像您将它们放在 procrustes bed.
中一样
更糟糕的是,您称这些为 类 "generic",因此倾向于在应用程序的其他部分(也许是 DAL)中使用它们。只是不要。
在您的示例中清楚可见的是,一旦您开始反对基本设计原则,您就会陷入设计问题建筑你的申请。
所以,坚持众所周知的:
- 数据类(DTO)——生活在DAL,
- 商业objects/classes - 生活在 BL,
- 查看模型 - 位于表示层。
以这种方式分离您的应用会让您的生活更轻松。
我有一个分为两个项目的解决方案:一个包含我所有模型 class 的 class 库(我们称之为 Business),以及ASP.Net MVC 项目。
My Business classes 是通用的,适用于多种类型的项目。因此,它们不包含任何 数据注释/与其他 class 的关联 ,仅包含 成员变量/属性/构造函数.
使用代码优先方法,我应该如何设计我的 ASP.Net 模型以与我的 业务 模型一起工作。
我最初的教学是将我的 Business classes 设置为部分 classes,然后通过添加必要的 覆盖我的属性数据注释/关联。我不能那样做,因为我们正在处理两个不同的项目。
我也在想我可以使用继承。我的 ASP.Net 模型可以从业务 classes 继承,我可以在那。这看起来有点混乱和不合逻辑,因为我需要在这个新的 subclass.
中定义我所有的构造函数有没有一种聪明的方法可以干净地做到这一点?
编辑:
我的业务 classes 通过在 属性 setter 中抛出异常来进行验证。我的第一个设计是创建我自己的自定义 数据注释 ,它将捕获我的 setter 抛出的异常:
public class SetterBasedValidation : ValidationAttribute
{
string m_errorMessage = null;
public SetterBasedValidation(string errorMessage)
{
m_errorMessage = errorMessage;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
try
{
Type type = validationContext.ObjectType;
PropertyInfo property = type.GetProperty(validationContext.MemberName);
property.SetValue(validationContext.ObjectInstance, value);
}
catch (Exception)
{
return new ValidationResult(m_errorMessage);
}
return ValidationResult.Success;
}
}
然后我需要一种方法来在我的 ASP.Net 模型 class 中使用我的自定义数据注释。这会给我想要的结果:
- 保持我的业务class是通用的
- 使用我的设置器的验证
- 使用数据注释
将同一个类用于多种用途的想法不是很好。通常,业务 类 面向(负责)业务逻辑。另一方面,视图模型,因为这通常是您 ASP.NET MVC 模型文件夹中的内容,负责支持 MVC 应用程序的视图。最后还有数据 类(有些人称它们为 DTO),它们是您的 DAL 的一部分。
所以,从头到尾你应该有 数据 类、业务 类 和最后 查看模型 ,它构成了中型到大型 Web 应用程序的绝对最小值。即使是小型应用程序也能从这些分离中受益。
现在你可以回想一下SOLID的第一个字母,也就是单一职责原则,其中规定:
A class should have only one reason to change.
(有关单一职责原则的更多信息 here。)
您要做的是为您的业务分配两个角色 类,即业务和表示、视图模型。所以,比如说,你想涵盖一些新的业务功能,那么你的视图模型肯定会受到影响。另一方面,如果您想添加一些与视图功能相关的功能(您的情况),您的业务逻辑实现可能会受到威胁。这几乎就像您将它们放在 procrustes bed.
中一样更糟糕的是,您称这些为 类 "generic",因此倾向于在应用程序的其他部分(也许是 DAL)中使用它们。只是不要。
在您的示例中清楚可见的是,一旦您开始反对基本设计原则,您就会陷入设计问题建筑你的申请。
所以,坚持众所周知的:
- 数据类(DTO)——生活在DAL,
- 商业objects/classes - 生活在 BL,
- 查看模型 - 位于表示层。
以这种方式分离您的应用会让您的生活更轻松。