在c#console app中添加引用错误

时间:2013-11-24 09:30:22

标签: c# interface dependency-injection 3-tier

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

  • 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()
  4. Vehicle BL类的IVehicle方法
  5. BL在PMS.DAL ...
  6. 中调用VehicleDao的AddNewVehicle(IVehicle obj)方法

    所有工作正常但在构建时编译器说要在PMS.UI中添加PMS.Service的引用。

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

    是否有必要将PMS.Service的引用添加到PMS.UI,前提是它创建了Vehicle PMS.BL类的实例,它实现了PMS.Service中存在的IVehicle

    请帮助我我是新手在c#...

    中使用Interface

    谢谢你们的答案,但我仍然感到困惑。我将在这里展示我的代码。我已经将所有四个图层添加为不同的c类库(不同的图层)。

    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();
        }
    }
    

2 个答案:

答案 0 :(得分:0)

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

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

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

希望有所帮助。

答案 1 :(得分:0)

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

IHM => BLL => DAL
Core

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

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

我是初学者,喜欢你的界面。在这里,我将选择是否必须这样做:

4个项目:

  1. 核心
  2. BLL(DUcencies DAL - Core)
  3. DAL(DUcencies Core)
  4. IHM(DUcencies BLL - Core)
  5. 在Core中:两件事:一个接口IVehicle和一个实现这个类的类调用Vehicle

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

    在BLL中:两个对象:实现Core.Vehicule

    的Car和Truck

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

    在IHM中:BLL.Car的调用

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

    编辑: 我发布了一个类似你的问题:POO and Interface (in C#)

    希望对你有所帮助。