我的公司正在从旧版代码库过渡到一个更现代的平台,而我们正在迁移到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。项目划分如下:
一个例子可能像这样:
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;}
}
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操作保持一致吗?就像有一个带有DBContext的构造函数而没有一个呢?我已经看到一些项目有一个单独的库,仅针对没有CRUD操作的类,而我没有看到其中的价值。这种方式背后的逻辑是我们的大多数应用程序只是CRUD操作,因此我希望能够在以后的每个应用程序中重用该项目。从在线上看,此实现是DAL / BLL的混合
我目前对Blazor的执行是否“可行”?还是我可以遵循其他更好的设计规范?我喜欢MVVM,但到目前为止,我真的看不到任何实现的价值。让页面在ViewModel上调用函数,而只是在另一个具有相同名称/参数的类中调用函数的意义是什么?可以这么说,裁掉中间人不是很有意义吗?
我可以遵循任何示例企业项目来更好地了解在这里做什么?正如我已经说过的那样,我公司中没有任何一位高级人士可以就此进行讨论。我只是想使其尽可能适应变化/专业。
先谢谢您的帮助!
因此,我开始寻找更多示例项目,并且遇到了SPA Server Side Dapper应用程序(https://www.c-sharpcorner.com/article/create-a-blazor-server-spa-with-dapper/) 。从我在那里,在这里以及在其他任何地方可以看到的东西来看,添加一个单独的项目来仅处理CRUD操作似乎比其价值更大。
我将按照该链接中的内容来实现一些东西,然后看看它如何进行。如果有人在寻找灵感,这里有一些很好的例子:
https://github.com/AdrienTorris/awesome-blazor#sample-projects
FWIW,每个示例似乎都遵循此路径,只是在处理方式上略有不同(ORM使用,文件夹名称等)。这意味着我将需要添加更多的服务(总共至少20个),但是如果它是一个复杂的业务应用程序,我只是想这就是野兽的本质。
祝您编码愉快!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句