将自定义类型作为参数从PL传递到BLL,再传递到DAL以插入记录

本文关键字:DAL 记录 插入 BLL 自定义 参数 PL 类型 | 更新日期: 2023-09-27 18:24:07

我在项目中使用实体框架。我使用的是3层架构(表示层(PL)、业务逻辑层(BLL)和数据访问层(BAL))。实体框架定义了所有实体以及对BD的CRUD操作。

我遇到了一个基本问题。假设我需要在数据库中插入客户。我想按照

---------------PL-------------
Customer ObjCustomer=new Customer();
//init object
ObjCustomer.Name="";
--------------
------------
BLL.InsertCustomer(ObjCustomer)
------------------------------------------------
-------------------BLL---------------
DAL.InsertCustomer(ObjCustomer)
------------------------------------
-------------------DAL---------------
CustomerReporitory.InsertCustomer(ObjCustomer)
------------------------------------

现在的问题是客户在DAL中被定义为EF的一部分。在PL中使用DAL-ref是不可取的。我想传递自定义类类型,如customer作为参数。如何做到这一点。请给我一些示例代码。

将自定义类型作为参数从PL传递到BLL,再传递到DAL以插入记录

表示层中的Customer不应该是来自业务层或数据层的Customer。表示层中的Customer应该类似于ViewModel,因此它应该只携带属性并在业务层中声明。这是应该发送到CreateCustomer的业务层的对象类型,后者反过来从中创建业务实体或DAO,并将其传递给持久性。

表示层

UserViewModel theUser=new UserViewModel(userNameField,passwordField);
userController.CreateUser(theUser);

业务层

public class UserController
{
    public void CreateUser(UserViewModel user)
    {
        bool isUserValid=ValidateUser(user);
        if(isUserValid)
        {
            UserEntity theEntity=new UserEntity(user);
            _userRepository.Create(theEntity);
        }
        else
        {
            throw new InvalidUserException("This user isn't valid");
        }
    }
}

数据层

public class UserRepository
{
    public void Create(UserEntity user)
    {
        /* store user to database or whatever */
    }
}

如果你的模型没有方法或功能,只是一组get/set属性,你可以把它放在一个单独的程序集/命名空间中,让所有层都把模型作为依赖项。不过,这只建议在非常简单的应用程序中使用,对于任何更复杂的应用程序,请使用Tobias的方法。