【发布时间】:2013-12-21 07:10:09
【问题描述】:
我有一个域,员工可以在其中拥有一个角色列表。还有一个新的角色添加功能。在添加新角色时,我们需要检查员工是否已经拥有“VP”角色。如果它已经存在,则不应添加新角色。此逻辑需要存在于 Employee Domain 实体中。
我通过添加一个方法名 IsNewRoleAllowed() 开始它,它将返回一个布尔值。如果为真,业务层会将新角色插入数据库。
但为了更自然OO,我决定通过创建一个函数AddRole 来更改Employee 对象的职责。它将执行添加职责的角色,而不是返回布尔值。
我通过接收Action<int, int> 作为参数实现了上述目标。它工作正常。
问题
将 DAL 方法传递给实体是正确的做法吗?
更新
@ThomasWeller 添加了我同意的重要观点...
拥有角色是 BL 的纯粹概念。它与 DAL 无关。
在这种方法中,BL 将依赖于驻留在 DAL 中的代码。当 DAL 甚至不存在时,它 (BL) 甚至应该可以工作。
但是,由于我没有使用 ORM,我将如何修改代码以按照建议的方法工作?
参考文献
代码
域实体
public class Employee
{
public int EmployeeID { get; set; }
public string EmployeeName { get; set; }
public List<Role> Roles { get; set; }
//Add Role to Employee
public int AddRole(Role role, Action<int, int> insertMethod)
{
if (!Roles.Any(r => r.RoleName == "VP"))
{
insertMethod(this.EmployeeID, role.RoleID);
return 0;
}
else
{
return -101;
}
}
//IDataRecord Provides access to the column values within each row for a DataReader
//IDataRecord is implemented by .NET Framework data providers that access relational databases.
//Factory Method
public static Employee EmployeeFactory(IDataRecord record)
{
var employee = new Employee
{
EmployeeID = (int)record[0],
EmployeeName = (string)record[1],
Roles = new List<Role>()
};
employee.Roles.Add(new Role { RoleID = (int)record[2], RoleName = (string)record[3] });
return employee;
}
}
BusinessLayer.Manager
public class EmployeeBL
{
public List<Employee> GetEmployeeList()
{
List<Employee> employees = EmployeeRepositoryDAL.GetEmployees();
return employees;
}
public void AddRoleToEmployee(Employee emp, Role role)
{
//Don't trust the incoming Employee object. Use only id from it
Employee employee = EmployeeRepositoryDAL.GetEmployeeByID(emp.EmployeeID);
employee.AddRole<Employee>(role, EmployeeRepositoryDAL.InsertEmployeeRole);
//EmployeeRepositoryDAL.InsertEmployeeRole(emp.EmployeeID, role.RoleID);
}
}
DAL
public static void InsertEmployeeRole(int empID, int roleID)
{
string commandText = @"INSERT INTO dbo.EmployeeRole VALUES (@empID, @roleID)";
List<SqlParameter> commandParameters = new List<SqlParameter>()
{
new SqlParameter {ParameterName = "@empID",
Value = empID,
SqlDbType = SqlDbType.Int},
new SqlParameter {ParameterName = "@roleID",
Value = roleID,
SqlDbType = SqlDbType.Int}
};
CommonDAL.ExecuteNonQuery(commandText, commandParameters);
}
【问题讨论】:
-
为什么你的
AddRole方法需要一个通用参数——你从不使用它。那又怎样?
标签: c# oop domain-driven-design