我的公司正在从传统代码库转移到更现代化的平台,我们正在转向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....
}
第二个项目是一个服务器Blazor项目,它引用了项目DAL。该项目分为以下几个部分:
- 模型 - 这些是特定于当前正在开发的项目的模型。例如,一个模型可能是几个表格的组合(来自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;}
}
- 页面 - Razor 页面/组件,带有页面引用。
- 共享 - Razor 组件 - 用于多个页面的内容。例如一个模态框。
- 服务 - 这应该是业务层。目前,在“Models”文件夹中,每个模型/类都有一个服务,但还有一些用于共享组件。例如,对于 Models 文件夹中的 EmployeeModel,可能如下所示:
public class EmployeeService
{
private DbContext _dbContext = dbContext;
public EmployeeService(DbContext dbContext)
{
_dbContext = dbContext;
}
public Task<EmployeeModel> Get(int id)
{
var personRepository = new Person(_dbContext);
var person = personRepository.Get(id);
Id = id;
if (id > 10)
Department = "Accounting"
etc...
}
public Task<int>CalculateBonus(DateTime hireDate, string department, decimal salary)
{
//logic here...
}
}
服务和DbContext都是通过startup.cs进行依赖注入生成的。页面类将使用以下内容加载数据:
@code{
[Parameter]
int EmployeeId;
public Employee employee;
public decimal bonus;
protected override OnAfterRenderAsync(bool firstRender)
{
if (!firstRender)
return;
employee = EmployeeService.Get(EmployeeId);
}
public void GetBonus()
{
if (employee != null)
bonus = EmployeeService.CalculateBonus(employee.HireDate, employee.Department, employee.Salary)
}
}
目前看起来还不错,但是有很多不同的解释。例如,我喜欢使用MVVM模式的想法。我最初关注的示例链接如下:https://itnext.io/a-simple-mvvm-implementation-in-client-side-blazor-8c875c365435
然而,我不明白为什么要像那个例子中那样将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...
}
}
然后在页面上会像以下内容:
@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();
}
}
由于我长期使用遗留代码且没有更高级别的人告诉我正确性,因此我想知道我的做法是否正确。特别是因为这应该是我们业务向前发展的核心,我不希望最终出现混乱不堪的代码或需要进行完全重构。
我想问以下问题:
我的DAL目前实现得如何?在CRUD操作中直接定义属性是否可以?例如设置一个包含与数据库上下文相关的构造函数以及一个无参构造函数。我看到一些项目只为该类创建了另一个没有CRUD操作的库,但我并没有看到其中的价值。这样做的逻辑是,大多数应用程序只涉及CRUD操作,所以我希望能够在每个应用程序中重用该项目。根据网上查找,这种实现是DAL/BLL的混合体。
我的Blazor实现目前是否“有效”?还有其他更好的设计实践吗?我喜欢MVVM,但我真的没有看到迄今为止任何实现的价值。如果页面只是调用ViewModel中的函数,而ViewModel只是调用另一个具有相同名称/参数的类中的函数,这有什么意义呢?去掉中间环节难道不是更合理吗?
是否有任何样例企业项目可以供我参考,以便更好地了解如何做到这一点?正如我所说,公司中没有资深人员可供参考。我只是想让它尽可能适应变化/专业。
提前感谢您的帮助!