C# 使用从不同程序集中的类继承的模型的代码优先方法

C# 使用从不同程序集中的类继承的模型的代码优先方法,c#,asp.net,asp.net-mvc,ef-code-first,C#,Asp.net,Asp.net Mvc,Ef Code First,我有一个分为两个项目的解决方案:一个包含所有模型类的类库(我们称之为业务),一个ASP.NETMVC项目 我的业务类是通用的,适用于多种类型的项目。因此,它们不包含与其他类的任何数据注释/关联,只包含成员变量/属性/构造函数 使用代码优先的方法,我应该如何设计我的ASP.Net模型以与我的业务模型协同工作 我最初的教学是将我的业务类设置为部分类,然后通过添加必要的数据注释/关联来覆盖我的属性。我不能这样做,因为我们正在处理两个不同的项目 我还认为我可以使用继承。我的ASP.Net模型可以从业务类

我有一个分为两个项目的解决方案:一个包含所有模型类的类库(我们称之为业务),一个ASP.NETMVC项目

我的业务类是通用的,适用于多种类型的项目。因此,它们不包含与其他类的任何数据注释/关联,只包含成员变量/属性/构造函数

使用代码优先的方法,我应该如何设计我的ASP.Net模型以与我的业务模型协同工作

我最初的教学是将我的业务类设置为部分类,然后通过添加必要的数据注释/关联来覆盖我的属性。我不能这样做,因为我们正在处理两个不同的项目

我还认为我可以使用继承。我的ASP.Net模型可以从业务类继承,我可以在上面添加我的数据注释/关联。这看起来有点混乱和不合逻辑,因为我需要在这个新的子类中定义我的所有构造函数

有没有一种聪明的方法可以干净利落地做到这一点

编辑:

我的业务类通过在属性设置器中抛出异常来进行验证。我的第一个设计是创建我自己的自定义数据注释,它将捕获我的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模型类中使用自定义数据注释的方法。这将给我我想要的结果:

  • 保持我的商业课程通用性
  • 使用来自我的setters的验证
  • 使用数据注释
将同一类用于多种目的的想法不是很好。通常,业务类面向(负责)业务逻辑。另一方面,视图模型(因为这通常是ASP.NET MVC模型文件夹中的模型)负责支持MVC应用程序的视图。最后还有一些数据类(有人称之为DTO),它们是DAL的一部分

因此,从后面到前面,您应该有数据类业务类,最后是视图模型,这是中型到大型web应用程序的绝对最小值。即使是小型应用程序也能从这些分离中获益

现在您可以回忆起SOLID的第一个字母,即单一责任原则,该原则规定:

一个类应该只有一个更改的原因

(更多关于单一责任原则。)

您试图做的是为您的业务类分配两个角色,即业务和演示、视图模型。所以,比方说,您希望涵盖一些新的业务功能,那么,您的视图模型肯定会受到影响。另一方面,如果您想添加一些与视图相关的功能(您的案例),您的业务逻辑实现可能会受到威胁。这就像你把它们放在一个盒子里

更糟糕的是,您将这些类称为“泛型”,因此倾向于在应用程序的其他部分(可能是DAL)中使用它们。别这样

在您的示例中可以清楚地看到,一旦您开始与基本设计原则抗争,您就陷入了构建应用程序的设计难题

因此,坚持众所周知的原则:

  • 数据类(DTO)-生活在DAL
  • 业务对象/类别-居住在BL
  • 视图模型-位于表示层中

  • 以这种方式分离应用程序将使您的生活更加轻松。

    在大多数业务领域中,您可以通过数据注释和关联指定的内容将应用于为该业务编写的任何应用程序。我有点惊讶,你看到了重用的潜力,不知道你是否想得太多了。UI项目中的模型对象通常应该与业务对象不同。@EricJ。在这种情况下,您将如何处理此问题?在我的业务类中直接使用数据注释,而完全绕过ASP.Net模型?