我的公司正在从旧版代码库过渡到一个更现代的平台,而我们正在迁移到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通过依赖项注入(inject)生成的。页面类将通过以下几行加载数据:
@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();
}
}
看到我使用遗留代码的方式已经存在了这么长时间,没有其他人告诉我,我只是想知道自己做得对。这是特别正确的,因为这应该是我们业务发展的核心,并且我不想结束意粉代码或进行彻底的重构。
我想我的问题如下:
在此先感谢您的帮助!
最佳答案
我刚刚用3个Web应用程序创建了一个新的ASP .NET Core 3.1项目:MVC,Razor Pages和Blazor。
NetLearner:https://github.com/shahedc/NetLearnerApp
我正在并行开发所有3个组件,以便您可以在所有组件中看到相似的功能。我已将常见项目提取到共享库中,以方便共享。
共享库包括:
这是相应的博客文章,随后是A-Z每周系列,它将在接下来的6个月中探讨26个不同的主题。
希望当前版本对您的要求有用。请随时关注并随时就项目结构提出建议或提供反馈。
关于c# - Blazor项目结构/最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59538859/