将 LINQ 与不同层一起使用意味着我无法访问特定类型
Using LINQ with different layers means I can't access a specific type
我的解决方案有 3 层:
- DAL(正在使用 LINQ 访问我的数据库)
- 业务层
- Winform
在我的 DAL 中,我从我的数据库中返回一个具有特定类型的 List
,我也在我的 BLL 中做同样的事情。
当我想在 UI 中使用我的函数时,出现错误:
The type 'Reservation' is defined in an assembly that is not referenced...
现在我想避免在 UI 中引用我的 DAL。
由于我是新手,在网上找不到明确的答案,有人可以帮我吗?
我的DAL功能
public static List<Reservation> SelectListReservation()
{
try
{
List<Reservation> lstReservation = new List<Reservation>();
lstReservation = oExamenSgbdEntities.Reservations.ToList();
return lstReservation;
}
catch (Exception e)
{
throw e;
}
}
我的BLL函数
public static List<DataAccess.Reservation> GetListReservation()
{
try
{
List<DataAccess.Reservation> lstToReturn = new List<Reservation>();
lstToReturn = GetListReservation();
return lstToReturn;
}
catch (Exception e)
{
throw e;
}
}
我如何在 UI 中调用我的 BL 函数:
var lstRes = Manage.GetListReservation();
如果你切入 DAL、BL 和 P,你的 BL 方法不能 return 与你的 DAL 类型相同。
P使用BL,BL使用DAL
因此P是从DAL中抽象出来的
如果包含在 DAL 中,则预留仅供 BL 使用
解耦你的 DAL 类型和你的 BL 类型或者选择不同的架构。
一个解决方案是创建一个数据传输对象 (DTO) 库来包装数据层中的对象,因为它们是在单独的程序集中定义的。然后业务层可以调用数据库并将结果转换为这些新的 类.
这打破了表示层和数据层之间的依赖关系,还允许您自定义从数据 -> 业务公开的内容 and/or业务 -> 表示(您可以从数据库聚合多个对象合并成一个,您可以尽可能地暴露更小的对象)。
您可以在此处阅读更多相关信息:Create Data Transfer Objects (DTOs)
从您问题的详细信息来看,您似乎正在使用 Traditional N-Layer Architecture。在这个架构中,UI层依赖于BLL,而BLL又依赖于DAL。那应该是您的参考结构:UI 项目引用 BLL 项目,BLL 项目引用 DAL 项目。
这对您意味着,您不能在 UI 中使用来自 DAL 的 classes; UI 不应该知道 DAL 的实现,因为 DAL 可能会改变(比如从 SQL 服务器数据库移动到 Oracle 数据库)。因此,为了从 DAL 获取数据到 BLL,您需要在 BLL 中创建一个模型 class,并将 DAL class 中的所有数据映射到它。
例如,在您的 BLL 中,您需要添加一个 ReservationModel
class,它将映射到您的 DAL 中的 Reservation
class:
public class ReservationModel
{
// Add the same properties that are in the Reservation class in
// the DAL to this class. The properties below are just for example
public int ReservationId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int CustomerId { get; set; }
}
然后在 BLL 中,将 GetListReservation()
方法更改为 return a ReservationModel
,所有数据都映射自 DAL 中的 Reservation
class:
public static List<ReservationModel> GetListReservation()
{
var reservationModels = new List<ReservationModel>();
foreach (var reservation in SelectListReservation())
{
reservationModels.Add(new ReservationModel
{
// Again, these are made-up properties for illustration purposes
ReservationId = reservation.ReservationId,
StartDate = reservation.StartDate,
EndDate = reservation.EndDate,
CustomerId = reservation.CustomerId
});
}
return reservationModels;
}
我的解决方案有 3 层:
- DAL(正在使用 LINQ 访问我的数据库)
- 业务层
- Winform
在我的 DAL 中,我从我的数据库中返回一个具有特定类型的 List
,我也在我的 BLL 中做同样的事情。
当我想在 UI 中使用我的函数时,出现错误:
The type 'Reservation' is defined in an assembly that is not referenced...
现在我想避免在 UI 中引用我的 DAL。
由于我是新手,在网上找不到明确的答案,有人可以帮我吗?
我的DAL功能
public static List<Reservation> SelectListReservation()
{
try
{
List<Reservation> lstReservation = new List<Reservation>();
lstReservation = oExamenSgbdEntities.Reservations.ToList();
return lstReservation;
}
catch (Exception e)
{
throw e;
}
}
我的BLL函数
public static List<DataAccess.Reservation> GetListReservation()
{
try
{
List<DataAccess.Reservation> lstToReturn = new List<Reservation>();
lstToReturn = GetListReservation();
return lstToReturn;
}
catch (Exception e)
{
throw e;
}
}
我如何在 UI 中调用我的 BL 函数:
var lstRes = Manage.GetListReservation();
如果你切入 DAL、BL 和 P,你的 BL 方法不能 return 与你的 DAL 类型相同。
P使用BL,BL使用DAL
因此P是从DAL中抽象出来的
如果包含在 DAL 中,则预留仅供 BL 使用
解耦你的 DAL 类型和你的 BL 类型或者选择不同的架构。
一个解决方案是创建一个数据传输对象 (DTO) 库来包装数据层中的对象,因为它们是在单独的程序集中定义的。然后业务层可以调用数据库并将结果转换为这些新的 类.
这打破了表示层和数据层之间的依赖关系,还允许您自定义从数据 -> 业务公开的内容 and/or业务 -> 表示(您可以从数据库聚合多个对象合并成一个,您可以尽可能地暴露更小的对象)。
您可以在此处阅读更多相关信息:Create Data Transfer Objects (DTOs)
从您问题的详细信息来看,您似乎正在使用 Traditional N-Layer Architecture。在这个架构中,UI层依赖于BLL,而BLL又依赖于DAL。那应该是您的参考结构:UI 项目引用 BLL 项目,BLL 项目引用 DAL 项目。
这对您意味着,您不能在 UI 中使用来自 DAL 的 classes; UI 不应该知道 DAL 的实现,因为 DAL 可能会改变(比如从 SQL 服务器数据库移动到 Oracle 数据库)。因此,为了从 DAL 获取数据到 BLL,您需要在 BLL 中创建一个模型 class,并将 DAL class 中的所有数据映射到它。
例如,在您的 BLL 中,您需要添加一个 ReservationModel
class,它将映射到您的 DAL 中的 Reservation
class:
public class ReservationModel
{
// Add the same properties that are in the Reservation class in
// the DAL to this class. The properties below are just for example
public int ReservationId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int CustomerId { get; set; }
}
然后在 BLL 中,将 GetListReservation()
方法更改为 return a ReservationModel
,所有数据都映射自 DAL 中的 Reservation
class:
public static List<ReservationModel> GetListReservation()
{
var reservationModels = new List<ReservationModel>();
foreach (var reservation in SelectListReservation())
{
reservationModels.Add(new ReservationModel
{
// Again, these are made-up properties for illustration purposes
ReservationId = reservation.ReservationId,
StartDate = reservation.StartDate,
EndDate = reservation.EndDate,
CustomerId = reservation.CustomerId
});
}
return reservationModels;
}