我最新的MVC解决方案包含一个MVC5站点和一个DAL类库,它将包含每个实体的存储库接口和类。我试图找出为我的实体放置业务逻辑的位置,例如CheckingAccount.Withdrawl或CheckingAccount.Deposit。有什么建议?这应该在MVC项目的Model文件夹中完成,而所有的存储库类都在我的DAL中吗?
答案 0 :(得分:3)
理想情况下,您希望将实际业务逻辑与实体分离,并通过创建业务逻辑层并使用IoC容器将存储库注入服务/业务逻辑层,尽可能将其从数据库或ORM中抽象出来。 dependency injection
常见的方法是为您的业务逻辑层创建一个单独的类库,该库仍然与您的UI层无关(意味着您的UI层可能是MVC前端甚至是宁静的Web服务),并通过数据传输对象进行通信。 / p>
这是一个简单的例子:
MVC控制器/用户界面
public class AccountCheckingController : Controller
{
private readonly IAccountService AccountService;
public CheckingAccountController(IAccountService accountService)
{
this.AccountService accountService;
}
[HttpPost]
public ActionResult Deposit(decimal depositAmount)
{
...
DepositReceiptDto depositReceipt = this.accountServive.Deposit(accountId, depositAmount);
...
return new DepositViewModel {
Receipt = depositReceipt
}
}
}
商业逻辑类/服务(存储在WebsiteName.Services
或Website.BusinessLogic
public class AccountService : IAccountService
{
private readonly IAccountRepository Repository;
public AccountService(IAccountRepository repository)
{
this.Repository = repository;
}
public DepositReceiptDto Deposit(int accountId, decimal depositAmount)
{
// Perform actions against your repository/ORM here.
return new DepositReceiptDto {
DepositAmount = depositAmount,
User = UserDto,
Status = Status.Success
};
}
...
}
正如您所看到的,通过使用这种分离,您可以轻松切换UI,而无需执行大量工作。
我希望这会有所帮助。
答案 1 :(得分:1)
如果某个东西不是一个实体而且不是一个价值对象,那么它就是一个服务。服务的正确名称空间取决于他的级别。数据访问服务可能位于Project.Dal
或Project.Dal.Services
。域服务的良好命名空间是Project.Domain.Services
。