使用MVC5 Repository模式,但需要有关业务逻辑放置位置的建议

时间:2014-12-27 00:17:42

标签: asp.net-mvc-5 entity-framework-6 repository-pattern

我最新的MVC解决方案包含一个MVC5站点和一个DAL类库,它将包含每个实体的存储库接口和类。我试图找出为我的实体放置业务逻辑的位置,例如CheckingAccount.Withdrawl或CheckingAccount.Deposit。有什么建议?这应该在MVC项目的Model文件夹中完成,而所有的存储库类都在我的DAL中吗?

2 个答案:

答案 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.ServicesWebsite.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.DalProject.Dal.Services。域服务的良好命名空间是Project.Domain.Services