【问题标题】:Add reference Error in c# console app在 c# 控制台应用程序中添加引用错误
【发布时间】:2013-12-08 23:55:22
【问题描述】:

我正在使用 VS2010 在 C# 中创建一个控制台应用程序。它基于包含三层的三层架构

  • PMS.UI
  • PMS.DAL
  • PMS.BL

为了移除 PMS.DAL 和 PMS.BL 之间的循环依赖,我添加了一个额外的层 PMS.Service。

  1. 我在 PMS.BL 中创建了一个 Vehicle 类,它实现了 PMS.Service 的接口 IVehicle
  2. 我在 DAL 和 BL 中都添加了 PMS.Service 的引用。
  3. 现在 UI 调用实现 IVehicle 的 BL 类的 Vehicle 类的 AddNewVehicle() 方法
  4. 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


【解决方案1】:

使用给定的详细信息(并且没有代码)。这是我的理解。

PMS.Service (IVehicle.cs)
PMS.BL (Vehicle : IVehicle)

在这种情况下,如果要公开 Vehicle,则还必须添加对 PMS.Service 的引用。在任何情况下,在服务实现中拥有模型接口/联系人看起来都不正确。我宁愿考虑创建 PMS.Contracts 并在那里拥有我的模型/服务合同。

希望对您有所帮助。

【讨论】:

  • PMS.Service 只包含在 PMS.BL 中实现的接口,为什么我需要添加对 PMS.Service 的引用,如果它只包含不依赖于其他接口的接口。
【解决方案2】:

我认为您遇到了架构问题。基本上,如果你在三层,这是个好方法:

IHM => BLL => DAL
Core

Core 是一个项目,包含工具功能(格式日期、数字等)和您的界面。

依赖关系:IHM 参考 BLL / BLL 参考 DAL。所有这些参考核心。核心没有依赖。

我和你一样是界面初学者。如果必须这样做,我会选择这种方式:

4 个项目:

  1. 核心
  2. BLL(依赖 DAL - 核心)
  3. DAL(依赖核心)
  4. IHM(依赖 BLL - 核心)

在核心中:两件事:一个接口 IVehicle 和一个实现此类调用 Vehicle 的类

因为我们需要使用 DAL,所以我不知道如何不使用 Core.Vehicle。抽象类不好,因为如果 DAL 需要返回“IVehicule”对象,我们需要实现一个对象,而我们不能实现抽象或接口。

在 BLL 中:两个对象:实现 Core.Vehicule 的 Car 和 Truck

在 DAL 中:一个对象:带有返回 Core.Vehicule 方法的车辆

在 IHM 中:BLL.Car 的调用

它正在做的事情......

编辑: 我已经发布了一个像你这样的问题:POO and Interface (in C#)

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多