2010-06-28 2 views
0

내가 무슨 일이 일어나고 있는지, 왜 그 오류가 던져 지는지 (GetBrokenRules 메서드는 List가 없기 때문에) 찾을 수 있습니다.하지만이 질문을 게시 한 이유는 더 나은 디자인을 요구하는 것입니다. 나 여기 좀 도와 줘? 내가 시설 클래스 일하고도메인 모델을 desigining - 도움이 필요합니다.

(목록 .../건물/층)

오류 :

오류 3 'System.Collections.Generic.List'GetBrokenRules '에 대한 정의가 포함되어 있지 않습니다 '및'System.Collections.Generic.List '형식의 첫 번째 인수를 받아들이는 확장 메서드'GetBrokenRules '을 찾을 수 없습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?)

>>>에 오류가 있습니다. if (Campus.GetBrokenRules(). Count> 0)

내 더 나은 방법은 내 GetBrokenRules() 무엇입니까?

i 캠퍼스는 IBuilding, IFloor 대신은 IList의 인수로 다음

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

답변

0

ICampus, IBuilding 및 IFloor에 대한 정의는 어디에 있습니까? 그것들은 IFacilities에 필수적인 것처럼 보입니다. 또한 개체 자체가 아니라 개체 목록에서 GetBrokenRules()를 호출합니다.

나는 ICampus, IBuilding 및 IFloor가 올바르게 정의되었다고 가정하고 있으며, 현재 유일한 문제는 목록에서 메서드를 호출하고 있다는 것입니다. List에서 열거하고 각 항목에서 해당 메서드를 호출해야합니다. 뭔가 같은 :

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

(. 당신은 내가 기억하지 않습니다하지만 그건 중요하지 그래서 목록을 통해 열거하는 다른 방법이있다, .ForEach에 대한 nVentive Umbrella extensions이 필요할 수 있습니다.)

+0

@David : ICampus ...는 두 개의 속성 (id, name)을 가지고 있는데, 그 이유는 개체는 ICampus이고 IBuilding은 분리 된 개체입니다. 의미가 있습니까? –

+0

@teki : 그래서 ICampus (그리고 저는 IBuilding과 IFloor로 가정)가 GetBrokenRules()를 정의하지 않았습니까? 그러면 그 객체에서 그 메소드를 호출 할 수 없습니다. 무슨 "깨진 규칙"당신이 그 객체에서 벗어나려고하고 어떻게 그들을 얻는 계획입니까? – David

+0

내가 어떻게하는지 확인 : else if (Campus.GetBrokenRules(). Count> 0)? 만약 내가 Campus.ForEach를 사용한다면 –

0

내가 생성자에서 널 점검을하고 걸릴 것 IEnumerables로 구성되어 있습니다. null 인 경우 예외를 throw하는 부작용이있는 IEnumerables에서 ToList()를 호출 할 수 있습니다.

나는

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 인터페이스를 구현 건물, 바닥, 캠퍼스 등을 가지고 GetBrokenRules의 반환 방법과는 IEnumerable과 IFacility 인터페이스를 만들 것입니다.

+0

감사하지만 내 질문에 더 관련이 있습니다 GetBrokenRules() 메서드. –

+0

아, 질문을 잘못 해석했습니다. 나는 이것이 비즈니스 규칙이라는 것을 깨닫지 못했습니다. 나는 그들이 20 피트 이내 금연 또는 오후 10시 이후 소녀 건물에 허용 된 소년이 없음과 같은 규칙이라고 생각했습니다. –

0

GetBrokenRules() 수행 인수를 취하지 않고 확장 메서드가 아니므로 처리해야 할 목록이 무엇인지 모릅니다. 그보다 더 어려운 것은 처리하고자하는 모든 목록을 다른 인터페이스 유형의 목록으로 정의하므로 공통점이 없습니다.

이 문제를 처리하는 한 가지 방법은 IBuilding, ICampus 및 IFloor에 대한 공통 처리를 정의하는 새 인터페이스를 정의하고이 인터페이스 각각에이 새 인터페이스 (IFacility라고 함)를 상속받는 것입니다. 그런 다음 GetBrokenRules를 정의하여 List 인수를 가져 와서 List에 전달할 수 있습니다. GetBrokenRules는 IFacility에 정의 된 메서드를 호출 할 수 있으므로 현재 문제를 해결하기에 충분할 수 있습니다.

그러나 지금하고있는 방식 (Campus.GetBrokenRules())이 아닌 인수로 목록을 전달해야합니다.확장 메소드를 사용할 수있는 경우이 구문을 사용할 수 있지만 일반 콜렉션에 확장 메소드를 정의 할 때 까다로울 수 있습니다. 나는 지금 당장이를 반대 할 것입니다.

2
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

입력에 감사드립니다. 느슨하게 클래스가있는 이유는 1) 캠퍼스/빌딩/플로어로 구성된 시설 2) 입장 포인트가 캠퍼스/빌딩을 사용하고 두 인터페이스를 생성 한 것과 같습니다. 1) IFACilities 2) IPointOfEntry ... 아직도 내가 ICampus, IBuilding, IFloor를 제거해야한다고 생각합니까? –

+0

인터페이스를 구현하는 비즈니스 (서비스 아님) 클래스가 하나 뿐인 경우 값을 추가하지 않기 때문에 제거 할 수 있습니다. 그런데 noblethrasher가 지적했듯이 생성자에서 null 콜렉션을 확인해야합니다. 그렇지 않으면 코드에 대한 내 의견이 잘못되었습니다. –

+0

+1 감사합니다 ....... –