【发布时间】:2013-12-08 23:55:22
【问题描述】:
我正在使用 VS2010 在 C# 中创建一个控制台应用程序。它基于包含三层的三层架构
- PMS.UI
- PMS.DAL
- PMS.BL
为了移除 PMS.DAL 和 PMS.BL 之间的循环依赖,我添加了一个额外的层 PMS.Service。
- 我在 PMS.BL 中创建了一个
Vehicle类,它实现了 PMS.Service 的接口IVehicle。 - 我在 DAL 和 BL 中都添加了 PMS.Service 的引用。
- 现在 UI 调用实现
IVehicle的 BL 类的Vehicle类的AddNewVehicle()方法 - BL 调用 PMS.DAL 中 VehicleDao 的
AddNewVehicle(IVehicle obj)方法...
一切正常,但在构建编译器时说要在 PMS.UI 中添加 PMS.Service 的引用。
PMS.UI 没有实现 PMS.Service 的任何接口,而是调用实现了IVehicle 的 PMS.BL 的 Vehicle 类的 AddNewVehicle() 方法。
是否有必要将 PMS.Service 的引用添加到 PMS.UI,仅当它创建 PMS.BL 的 Vehicle 类的实例时,它实现了 PMS.Service 中存在的 IVehicle..
请帮助我,我是在 c# 中使用接口的新手...
谢谢大家的回答,但我仍然很困惑。我将在这里展示我的代码。我已将所有四个层添加为不同的 c sharp 类库(不同的层)。
1)PMS.UI(Added reference of PMS.BL)
Program.cs
using System;
using PMS.BL;
namespace PMS.APP
{
class Program
{
static void Main()
{
var vBo = new VehicleBo();//Compiler Says Add reference of PMS.Service here.Why is it necessary to add Reference of it??
vbo.VehicleNumber = "BA1PA 1212";
vbo.VehicleType = "Bike";
vbo.SaveNewVehicle();
}
}
}
2)PMS.BL(Added reference of PMS.DAL and PMS.Service)
VehicleBO.cs
using PMS.DAL;
using PMS.Service;
namespace PMS.BL
{
public class VehicleBo : IVehicle
{
public string VehicleNumber { get; set; }
public string VehicleType { get; set; }
public void SaveNewVehicle()
{
var vDao = new VehicleDao();
vDao.SaveNewVehicle(this);
}
}
}
3)PMS.DAL(Added reference of PMS.Service)
using PMS.Service;
namespace PMS.DAL
{
public class VehicleDao
{
public void SaveNewVehicle(IVehicle obj)
{
//code to insert in database
}
}
}
4)PMS.Service
IVehicle.cs
namespace PMS.Service
{
public interface IVehicle
{
string VehicleNumber { get; set; }
string VehicleType { get; set; }
void SaveNewVehicle();
}
}
【问题讨论】:
-
请在PMS.UI 中调用
Vehicle类的AddNewVehicle()方法的地方添加代码段?是否在Vehicle类或IVehicle接口的实例上调用它至关重要。 -
我在 Andrii Kalytiiuk 上面添加了代码,请查看它..
-
您需要在 PMC.UI 中引用 PMS.Service,因为 PMS.UI 引用了 PMS.BL,它定义了类似
SaveNewVehicle(IVehicle obj)的函数,其中IVehicle在 PMS.Service 中定义。因此,为确保来自 PMS.BL 的所有调用在 PMS.UI 中有效 - 您需要在 PMS.UI 中引用 PMS.Service 以及 PMS.BL(否则调用SaveNewVehicle(IVehicle obj)将无效,因为 PMS.UI 将对IVehicle一无所知)。 -
这是最佳实践吗?或者还有其他替代品
-
这就是 .NET 框架和 Visual Studio 的工作方式。有很多替代方案,但这意味着您的应用程序架构发生了变化,并且属于 设计模式 主题,并且大大超出了一条评论或一个问题的范围。
标签: c# interface dependency-injection 3-tier