2013-11-14 3 views
8

У меня есть следующие проекты в визуальном решении студии для приложения:Работа с перечислениями, когда интерфейсы находятся в отдельном проекте

  • Общие - методы Подсобные и расширения
  • Entities - объекты Rich Domain с бизнес-логикой конкретного в случаях
  • Хранилища - Данные Хранилища
  • DataServices - тонкая оболочка для Хранилища, содержит бизнес-логику, не относящуюся к экземпляру
  • Interfac es - Все интерфейсы для сущностей и хранилищ

Причина, по которой я помещаю интерфейсы в отдельный проект, избегает ссылок на круговые проекты. Это позволяет двум проектам ссылаться на общий интерфейс, не позволяя ссылаться на проект с конкретной реализацией.

Я не собирался проектировать ссылки в проекте «Интерфейсы», чтобы избежать ссылок на круговые проекты. Я создаю интерфейс для классов, определенных в других проектах, это позволяет мне ссылаться на интерфейс объекта, противоположный конкретной реализации в других интерфейсах.

Так пример будет:

namespace Acme.Entities 
{ 
    public class Person : IPerson 
    { 
     string Name { get; set; } 
    } 
} 
namespace Acme.Interfaces 
{ 
    public interface IPerson 
    { 
     string Name { get; set; } 
    } 
} 

namespace Acme.Interfaces 
{ 
    public interface ITeam 
    { 
     string Name { get; set; } 
     IPerson Leader { get; set; } 
    } 
} 

Проблема я столкнулся это, когда интерфейс ссылается на перечисление, определенный в другом проекте. Не двигая перечисления в рамках проекта Interfaces, я не уверен, как ссылаться на перечисления без создания ссылок проекта, например:

namespace Acme.Entities 
{ 
    public enum Status 
    { 
     Unknown =0, 
     Active = 1, 
     Active = 2  
    } 
} 

namespace Acme.Interfaces 
{ 
    public interface IPerson 
    { 
     string Name { get; set; } 
     Acme.Entities.Status ActiveStatus { get; set; } 
    } 
} 

Acme.Entities.Status потерпит неудачу, если я не ссылаться на проекте Acme.Entities , но это создаст циклическую ссылку, поскольку Acme.Entities ссылается на проект «Интерфейсы».

+4

Почему вы против перемещения перечисления в проект интерфейса? –

+0

Мне нужно пойти с @DStanley здесь. Вероятно, вы хотите переименовать свой проект «Интерфейсы» в «Common». –

ответ

9

Вам нужно либо переместить определение перечисления в проект «Интерфейсы», либо отдельный проект, который ссылается на оба проекта.

Я лично буду держать их в одном проекте - наличие отдельного проекта только для перечислений кажется излишним.

+0

Опираясь на перенос перечислений и интерфейсов в один проект, любые предложения по названию проекта, так как «Интерфейсы» не будут полностью описывать проект больше? –

+0

«Общий», как отметил упомянутый @MichaelPerrenoud, представляется разумным выбором. – OnoSendai

+0

«Домен» будет моим первым выбором. –

2

Я бы сказал, что ваши основные типы данных (включая enum s, interface s и class es) должны быть в одном проекте. Таким образом, ваш проект Interfaces должен включать в себя этот enum и любые другие типы данных, которые являются общими (возможно, базовых типов). Entities должен содержать элементы, относящиеся к реализации, которые расширяют и/или используют базовые вещи в Interfaces. Может также иметь смысл объединить Interfaces с вашим проектом Common, так как общая логика и общие данные часто идут вместе.

+0

Я столкнулся с той же проблемой, если я поместил интерфейсы в общий проект, потому что я не ссылаюсь на другие проекты в Common, чтобы избежать проблемы с круговой ссылкой. –

+0

Интерфейсы, перечисления и классы определенно. Тем не менее, я не уверен в абстрактных классах. Вы все равно должны протестировать любую реализацию внутри абстрактного класса. –

0

Если вы правильно определяете свои компоненты и интерфейсы, вы никогда не столкнетесь с этой проблемой.

Я предлагаю первый обзор кода и архитектуру приложений с этими двумя принципами:

http://en.wikipedia.org/wiki/Single_responsibility_principle http://en.wikipedia.org/wiki/Interface_segregation_principle

домена Driven Desgin ---> Очень бессильные правила: http://en.wikipedia.org/wiki/Domain-driven_design

Я согласен также с тем, что вы должны перенести SHARED Enums на общий IConstants.cs. Перечисления - это не что иное, как константы;

+0

«Перечисления - это не что иное, как константы». Они больше, чем просто константы. –

+1

@DStanley Это философский комментарий, который некоторые ppl не принимают, и другие видят перечисления как коллекцию consts, а другие не делают этого, потому что они могут применять операцию на Enums и т. Д. Я не буду участвовать в этом обсуждении. –

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