2013-11-24 1 views
0

Я создаю консольное приложение на C#, используя VS2010. Он основан в 3-Layer Архитектура, содержащий три слояДобавить ссылку Ошибка в приложении C# console

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

Чтобы удалить циклическую зависимость между PMS.DAL и PMS .BL Я добавил дополнительный слой PMS.Service.

  1. Я создал Vehicle класс в PMS.BL, который реализует интерфейс IVehicle от PMS.Service.
  2. Я добавил ссылку на PMS.Service как в DAL, так и в BL.
  3. Теперь UI вызывает AddNewVehicle() метод Vehicle класса BL, который реализует IVehicle
  4. BL вызывает AddNewVehicle(IVehicle obj) метод VehicleDao в PMS.DAL ...

Все работает нормально, но во время сборки компилятора говорит, чтобы добавить ссылка на PMS.Service в PMS.UI.

PMS.UI не реализует никакого интерфейса PMS.Service, но называет AddNewVehicle() метод класса транспортного средства PMS.BL, который реализует IVehicle.

Нужно ли добавить ссылку на PMS.Service в PMS.UI только если он создает экземпляр класса Vehicle PMS.BL, который реализует IVehicle присутствующую в PMS.Service ..

Пожалуйста, помогите мне, я новый использовать интерфейс в C# ...

Спасибо, ребята, за ответы, но я все еще смущен. Я представлю свой код здесь. Я добавил все четыре слоя как другую 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(); 
    } 
} 
+1

Пожалуйста, добавьте фрагменты кода, где вы называете метод 'AddNewVehicle()' класса Vehicle' в PMS.UI? Очень важно, называете ли вы его на примере класса «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.Service, на которую нужно ссылаться в PMS.UI вместе с PMS.BL (иначе вызов '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. Все эти ссылки Core. У ядра нет зависимости.

Я начинаю как вы с интерфейсом.Вот так я выберу, если я должен сделать это:

4 проекта:

  1. Ядро
  2. BLL (depecencies DAL - Core)
  3. ВВЛ (depecencies ядро)
  4. МЧХ (детекции BLL - Core)

In Core: Two things: Interface IVehicle и класс, реализующие этот класс вызова. Автомобиль

Поскольку нам нужно использовать DAL, я не знаю, как это сделать, чтобы не использовать Core.Vehicle. Абстрактный класс не является хорошим, потому что если DAL нужно вернуть объект «IVehicule», нам нужно реализовать объект, и мы не можем реализовать абстрактный или интерфейс.

В УСК: два объекта: легковых и грузовых автомобилей, которые реализуют Core.Vehicule

В DAL: один объект: VEHICULE с методом для возвратной Core.Vehicule

В IHM: вызов УСК. Автомобиль

И это делает вещь ...

EDIT: Я пост вопрос, как ваша: POO and Interface (in C#)

Надеюсь, он вам поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^