2013-11-24 80 views
0

我正在使用VS2010在C#中创建控制台应用程序。它是基于在3层结构的含三层在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调用方法的AddNewVehicle()Vehicle类BL的,它实现IVehicle
  4. BL调用PMS.DAL VehicleDao的AddNewVehicle(IVehicle obj)方法...

所有工作正常,但在构建编译器的时候说要加PMS.UI中的PMS.Service参考。

PMS.UI没有实现PMS.Service的任何接口,但调用AddNewVehicle() PMS.BL的Vehicle类的方法实现IVehicle

是否有必要添加PMS.Service的参考,只有当它创建Vehicle类PMS.BL的一个实现IVehicle目前在PMS.Service的实例PMS.UI ..

请帮助我,我是新在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(); 
    } 
} 
+1

请在PMS.UI中调用'Vehicle'类的'AddNewVehicle()'方法的地方添加代码段?无论您是通过“Vehicle”类还是“IVehicle”接口实例来调用它,都至关重要。 –

+0

我已在Andrii Kalytiiuk上面添加代码请检查它.. – rriwaj

+0

您需要在PMC.UI中为PMS.Service提供参考,因为PMS.UI引用了PMS.BL,它定义了像'SaveNewVehicle(IVehicle obj)'这样的函数,其中定义了IVehicle在PMS.Service中。因此,为了确保所有来自PMS.BL的调用在PMS.UI中都是有效的 - 您需要在PMS.UI中与PMS.BL一起引用PMS.Service(否则调用'SaveNewVehicle(IVehicle obj)'将无效PMS.UI将不知道任何关于'IVehicle')。 –

回答

0

用给出的细节(也没有代码)。这是我的理解。

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

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

希望有所帮助。

+0

PMS.Service只包含在PMS.BL中实现的接口为什么我需要添加对PMS.Service的引用(如果它只包含不依赖于其他接口的)。 – rriwaj

0

我认为你有一个架构问题。基本上,如果你是在三层,这是很好的方式:

IHM => BLL => DAL 
Core 

核心是一个项目中包含的工具功能(格式日期,数量等),你的界面。

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

我是初学者,喜欢你与界面。

  • DAL(depecencies核心)
  • IHM -

    1. 核心
    2. BLL(核心depecencies DAL):

      4个项目:在这里,如果我必须这样做,我会选择的方式(depecencies BLL - Core)

    内核:两件事:接口IVehicle和实现此类调用的类Vehicle

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

    在BLL:两个对象:汽车和卡车实现Core.Vehicule

    在DAL:一个目标:用VEHICULE的方法返回的一个Core.Vehicule

    在IHM:BLL的呼叫。汽车

    而且它做的事...

    编辑: 我已经交你们这样一个问题:POO and Interface (in C#)

    希望它能帮助你。