определение модели предметной области - нужна помощь - PullRequest
0 голосов
/ 28 июня 2010

я знаю, что происходит и почему он выдает ошибку (он не находит метод GetBrokenRules, потому что его список), но причина, по которой я разместил этот вопрос здесь, заключается в том, чтобы попросить лучшего дизайна, может кто-нибудь направить меня сюда, пожалуйста?*

Я работаю над классом объектов (Список .... / Здание / Этаж)

Ошибка:

Ошибка 3 «System.Collections.Generic.List» не содержитможет быть найдено определение для GetBrokenRules и отсутствует метод расширения GetBrokenRules, принимающий первый аргумент типа System.Collections.Generic.List (отсутствует директива using или ссылка на сборку?)

ошибка>>> >>> 1009 * else if (Campus.GetBrokenRules (). Count> 0)

Есть ли лучший способ описать мой GetBrokenRules ()?

ICampus, IBuilding, IFloor состоит из следующих

public interface ICampus
    {
        List<BrokenBusinessRule> GetBrokenRules(); 
        int Id { get; }
        string Name { get; }
    }

public interface IFacilities 
{
    List<BrokenBusinessRule> GetBrokenRules();
    List<ICampus> Campus { get; }
    List<IBuilding> Building { get; }
    List<IFloor> Floor { get; }  
}


public class Facilities : IFacilities 
    {
        private List<ICampus> _campus;
        private List<IBuilding> _building;
        private List<IFloor> _floor;  

        public List<ICampus> Campus
        {
            get { return _campus; }
        } 

        public List<IBuilding> Building
        {
            get { return _building; }
        }

        public List<IFloor> Floor
        {
            get { return _floor; }
        } 

        public Facilities(List<ICampus> campus, List<IBuilding> building, List<IFloor> floor)
        {
            _campus = campus;
            _building = building;
            _floor = floor; 
        } 

        public  List<BrokenBusinessRule> GetBrokenRules()
        {
            List<BrokenBusinessRule> brokenRules = new List<BrokenBusinessRule>(); 

           if (Campus == null)
                brokenRules.Add(new BrokenBusinessRule("Facility Campus", "Must have at least one Campus"));
            else if (Campus.GetBrokenRules().Count > 0)
            {
                AddToBrokenRulesList(brokenRules, Campus.GetBrokenRules());
            }

            if (Building == null)
                brokenRules.Add(new BrokenBusinessRule("Facility Building", "Must have at least one Building"));
            else if (Building.GetBrokenRules().Count > 0)
            {
                AddToBrokenRulesList(brokenRules, Building.GetBrokenRules());
            }

            if (Floor == null)
                brokenRules.Add(new BrokenBusinessRule("Facility Floor", "Must have at least one Floor"));
            else if (Floor.GetBrokenRules().Count > 0)
            {
                AddToBrokenRulesList(brokenRules, Floor.GetBrokenRules());
            }       
    }
} 

Ответы [ 4 ]

2 голосов
/ 28 июня 2010
public  List<BrokenBusinessRule> GetBrokenRules()
{
    var brokenRules = new List<BrokenBusinessRule>(); 

   // null is not possible because Campus is supplied in the constructor
   if (!Campus.Any())
        brokenRules.Add(new BrokenBusinessRule("Facility Campus", "Must have at least one Campus"));
   else
   {
       foreach(var campus in  Campus)
       {
           brokenRules.AddRange(campus.GetBrokenRules());
       }
   }

   if (!Building,Any())
        brokenRules.Add(new BrokenBusinessRule("Facility Building", "Must have at least one Building"));
    else
    {
        foreach(var building in Building)
        {
            brokenRules.AddRange(building.GetBrokenRules());
        }
    }

    if (!Floor.Any())
        brokenRules.Add(new BrokenBusinessRule("Facility Floor", "Must have at least one Floor"));
    else
    {
        foreach (var floor in Floor)
        {
            brokenRules.AddRange(floor.GetBrokenRules());
        }        
    }
    return brokenRules;     
}

Что касается редизайна, я сначала избавился бы от интерфейсов ICampus, IBuilding и IFloor и программы против классов. Я хотел бы создать интерфейс, который объявляет поведение GetBrokenRules и бизнес-классы реализуют это. Кроме того, мне кажется, что в Кампусе есть Здания, а в Здании есть Этажи, поэтому я разработал бы его таким образом, вместо того, чтобы собирать эти классы в класс Объектов.

0 голосов
/ 28 июня 2010

Где ваши определения для ICampus, IBuilding и IFloor? Те, кажется, являются неотъемлемой частью IFac Способностей. Кроме того, вы вызываете GetBrokenRules () для объекта List, а не для самих объектов.

Я собираюсь предположить, что ICampus, IBuilding и IFloor определены правильно, и на данный момент единственной проблемой является то, что вы вызываете метод из списка. Вам нужно будет перечислить по списку и вызвать этот метод для каждого элемента. Что-то вроде:

Campus.ForEach(c => AddToBrokenRulesList(brokenRules, c.GetBrokenRules()));

(Вам может понадобиться расширение nVentive Umbrella для .ForEach, я не помню. Но есть другие способы перечисления по списку, так что это не критично.)

0 голосов
/ 28 июня 2010

GetBrokenRules () не принимает никаких аргументов и не является методом расширения, поэтому он не знает, какой список он должен обрабатывать. Более сложным является то, что все списки, которые вы хотите обработать, определены как списки различных типов интерфейса, поэтому здесь нет единства.

Один из способов справиться с этим - определить новый интерфейс, который определяет общую обработку для IBuilding, ICampus и IFloor и каждый из этих интерфейсов наследуется от этого нового интерфейса (назовите его IFacility). Затем вы можете определить GetBrokenRules, чтобы получить аргумент List и передать ему List. GetBrokenRules сможет вызывать методы, определенные в IFacility, что может быть достаточно для прохождения вашей текущей проблемы.

Однако вам придется передавать список в качестве аргумента, а не так, как вы это делаете сейчас (Campus.GetBrokenRules ()). Вы можете использовать этот синтаксис, если вы можете заставить метод расширения работать, но это может быть сложно при определении методов расширения в универсальных коллекциях. Я бы посоветовал против этого сейчас.

0 голосов
/ 28 июня 2010

Я бы сделал нулевые проверки в конструкторе и взял бы IEnumerables в качестве аргумента вместо IList.Вы можете вызвать ToList () для IEnumerables, который имеет побочное преимущество - генерировать исключение, если оно пустое.

Я бы создал интерфейс IFacility с методом GetBrokenRules, который возвращает, и IEnumerable

public interface IFacility
{
    IEnumerable<BrokenRules> GetBrokenRules();
}

public static class Utils
{
    public static IEnumerable<BrokenRules> GetRules(this IEnumerable<IFacility> facilities)
    {
        return facilities.SelectMany(x => x.GetBrokenRules());
    }
}

Затем пусть здание, этаж, кампус и т. Д. Реализуют интерфейс IFacility.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...