C# Blazor项目结构/最佳实践

C# Blazor项目结构/最佳实践,c#,mvvm,.net-core,blazor,blazor-server-side,C#,Mvvm,.net Core,Blazor,Blazor Server Side,我的公司正在从传统的代码库转移到更现代的平台,我们正在转移到Blazor。我们目前正在参与ORM和最佳实践,在项目设置方面似乎有很多相互矛盾的想法(至少从我收集的资料来看)。我目前的结构如下: 首先是一个名为DAL的类库——这是我们的“数据层”。我们使用的是Dapper,它相对简单。示例类如下所示: public class Person { public string Id {get; set;} public string FirstName {get; set;}

我的公司正在从传统的代码库转移到更现代的平台,我们正在转移到Blazor。我们目前正在参与ORM和最佳实践,在项目设置方面似乎有很多相互矛盾的想法(至少从我收集的资料来看)。我目前的结构如下:

首先是一个名为DAL的类库——这是我们的“数据层”。我们使用的是Dapper,它相对简单。示例类如下所示:

public class Person
{
      public string Id {get; set;}
      public string FirstName {get; set;}
      public string LastName {get; set;}

      public Person() {}
      public Person(DbContext context) {}

      public void GetPerson(int id) {}
      public void DeletePerson(int id) {}


      etc....
}

@code{

    [Parameter]
    int EmployeeId;
    public decimal bonus;

    protected override OnAfterRenderAsync(bool firstRender)
    {
        if (!firstRender)
            return;

        EmployeeService.Get(EmployeeId); //reference Employee on page with EmployeeService.CurrentEmployee
    }

    public void GetBonus()
    {
        bonus = EmployeeService.CalculateBonus();
    }
}
第二个项目是一个服务器Blazor项目,它引用了DAL项目。项目划分如下:

public class EmployeeModel
{
    public int Id {get; set;}
    public int Department{get; set;}
    public DateTime HireDate {get; set;}
    public decimal Salary {get; set;}
    public Person {get; set;}
}
  • 模型-这些是特定于当前正在进行的项目的模型。例如,一个模型可能是多个表(DAL类中的模型)的组合,也可能只是用于网页上表单的字段
  • 例如:

    public class EmployeeModel
    {
        public int Id {get; set;}
        public int Department{get; set;}
        public DateTime HireDate {get; set;}
        public decimal Salary {get; set;}
        public Person {get; set;}
    }
    
  • 页面-带有页面引用的页面/组件
  • 共享-剃须刀组件-在多个页面上使用的东西。一个例子是模态
  • 服务——我想这是业务层。到目前为止,文件夹“Models”中的每个模型/类都有一个服务,但共享组件也有一些服务。Models文件夹中EmployeeModel的示例如下:
  • 到目前为止,这似乎进展顺利,但有很多不同的解释。例如,我喜欢使用MVVM模式的想法。我最初遵循的一个示例如下所示:

    然而,我并不认为将Model/ViewModel与示例中的Model/ViewModel分开的目的是什么,因为它们似乎在做相同的事情,但只是在应用程序中的不同区域。我在网上也找不到这种实现的任何其他例子,所以我认为我走错了路,最初放弃了这种方法,但在这个过程中,我仍然足够早,可以尝试一下这种方法。例如,EmployeeService类在该方法中如下所示:

    public class EmployeeService
    {
        private EmployeeModel _employeeModel;
        public EmployeeService(EmployeeModel employeeModel)
        {
            _employeeModel = employeeModel;
        }
    
        private EmployeeModel currentEmployee;
        public EmployeeModel CurrentEmployee
        {
            get { return currentEmployee}
        }
        {
            set {currentEmployee = value; }
        }
    
        public Task<EmployeeModel> Get(int id)
        {
             currentEmployee = EmployeeModel.Get(id);
        }
    
        public Task<int>CalculateBonus()
        {
             //logic implemented here with properties instead of parameters... 
        }
    }
    
    鉴于我一直在使用遗留代码,而且没有一位资深人士告诉我其他情况,我只想知道我做得对。这一点尤其正确,因为这应该是我们未来业务的核心,我不想以意大利面条式的代码结束,也不想做一个完整的重构

    我想我的问题如下:

  • 我目前的DAL实现情况如何?可以让实际属性与CRUD操作一致吗?就像有一个带DBContext的构造函数和一个不带DBContext的构造函数一样?我看到一些项目有一个单独的库,只用于没有CRUD操作的类,我没有看到其中的价值。这种方式背后的逻辑是,我们的大多数应用程序只是CRUD操作,因此我希望能够在以后的每个应用程序中重用该项目。从网上看,这个实现是DAL/BLL的混合

  • 我目前对Blazor的实现“有效”吗?或者我还有其他更好的设计实践可以遵循吗?我喜欢MVVM,但到目前为止,我还没有看到任何实现的价值。让页面调用ViewModel上的函数有什么意义,它只调用另一个类中具有相同名称/参数的函数?可以说,把中间人删掉是有道理的吗

  • 有没有什么样的企业项目可以让我更好地了解这里要做什么?正如我所说的,我的公司里没有一个高级职员可以去了解这些事情。我只是想让它尽可能适应变化/专业


  • 提前感谢您的帮助

    我刚刚创建了一个新的ASP.NET Core 3.1项目,其中包含3个web应用程序:MVC、Razor Pages和Blazor

    网络学习者:

    我正在并行开发所有3个,以便您可以在所有这些中看到类似的功能。我已将常用项提取到共享库中,以便于共享

    共享库包括:

    • 核心项目(模型和服务)
    • 基础架构项目(数据库上下文和迁移)
    下面是相应的博客writeup,随后将是A-Z周刊系列,该系列将在未来6个月内探讨26个不同的主题

    • 博文:
    希望当前版本对您的要求有用。请继续关注,随时就项目结构提出建议或提供反馈


    所以我开始寻找更多的示例项目,我发现了一个SPA服务器端整洁的应用程序()。从我在那里、这里以及我所看到的其他地方收集的信息来看,添加一个单独的项目来处理CRUD操作似乎比它的价值更麻烦

    我将按照链接中的内容实现一些东西,并看看它是如何运行的。如果其他人正在寻找灵感,这里有一些很好的例子:

    FWIW,每个示例似乎都遵循这条路径,只是似乎以稍微不同的方式进行(ORM使用、文件夹名称等)。这意味着我需要添加更多的服务(至少总共20个),但如果它是一个复杂的业务应用程序,我想这就是野兽的本质


    快乐编码

    在使用三层体系结构时,我看到业务层将增长,某些时间点会变得非常混乱和紧密耦合

    我建议试试看,它非常受欢迎,而且非常类似于

    我确信您正在寻找一些示例应用程序,以了解如何保持每一层的独立性,什么是最佳实践和最佳库

    试试下面的链接,你会在youtube上看到很多视频

    由于Blazor Web Assembly仍在预览中,我开始将我的个人网站从asp.netcore 2.0迁移到Blazor客户端和服务器端的Azure功能

    这是我的应用程序结构
    
    @code{
    
        [Parameter]
        int EmployeeId;
        public decimal bonus;
    
        protected override OnAfterRenderAsync(bool firstRender)
        {
            if (!firstRender)
                return;
    
            EmployeeService.Get(EmployeeId); //reference Employee on page with EmployeeService.CurrentEmployee
        }
    
        public void GetBonus()
        {
            bonus = EmployeeService.CalculateBonus();
        }
    }