2010-12-16 2 views
3

이전 관련된 질문 : 여기 Is this code decoupled and am I doing it right?퍼즐의 마지막 조각 :이 코드가 올바르게 분리되어 있습니까?

내 코드는 지금 모습입니다 : 이것은 마지막으로 분리 될 것으로 보인다

using System.Collections.Generic; 
using SharpDIC.Api.Models; 

namespace SharpDIC.Api.Interfaces 
{ 
    public interface IMemberFinder 
    { 
     IList<Member> FindAllMembers(); 
     Member FindMember(int memberId); 
     Member FindMember(string memberName); 
    } 
} 



using SharpDIC.Api.Interfaces; 

namespace SharpDIC.Api 
{ 
    public class MemberLister 
    { 
     private IMemberFinder _finder; 

     public MemberLister(IMemberFinder finder) 
     { 
      this._finder = finder; 
     } 
    } 
} 

! : D 귀하의 제안과 도움에 감사드립니다. 이제 공개 API에서 실제로 XML 응답을받는 실제 코드를 어디에서 작성해야합니까? 코드의 해당 부분을 어떻게 구성합니까?

IMemberFinder를 사용하는 이유는 JSON 및 기타 향후 공개 된 API를 완벽하게 사용하기 때문입니다.

도움 주셔서 감사합니다. 개발자는 자신의 지평을 넓히려는 개발자에게 엄청난 도움이됩니다.

편집 : 더 간결하게 내 질문 : 어디에서 XML을 얻을 수있는 방법을 쓸 것인가? '공용 클래스 MemberFinder : IMemberFinder'와 같은 인터페이스를 사용하지 않으므로 인터페이스의 메서드를 어떻게 구현합니까?

+0

죄송합니다. 무엇을 묻는 중입니까? IMemberFinder 구현을 어디에 두어야합니까? – annakata

+0

@annakata : 나는 그의 질문이이 질문의 후속 조치라고 생각한다. http://stackoverflow.com/questions/4461517/is-this-code-decoupled-and-am-i-doing-it-right –

+0

@annakata : XML을 가져오고 Member 객체를로드 할 실제 코드는 어디에 써야합니까? –

답변

0

세르지오,

여기에 있습니다. 당신의 콘크리트 구현 클래스의되었다 된 그 모든 :

using System; 
using System.Collections.Generic; 
using SharpDIC.Api.Interfaces; 
using SharpDIC.Api.Models; 

namespace SharpDIC.Api.Interfaces 
{ 
    public interface IMember 
    { 
     int Id { get; set; } 
     string Name { get; set; } 
    } 
    public interface IMemberFinder 
    { 
     IList<IMember> FindAllMembers(); 
     IMember FindMember(int memberId); 
     IMember FindMember(string memberName); 
    } 
} 

namespace SharpDIC.Api.Models 
{ 
    public class Member : IMember 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

namespace SharpDIC.Api.Classes 
{ 
    public class MyImplementedClass : IMemberFinder 
    { 
     public IList<IMember> FindAllMembers() 
     { 
      throw new NotImplementedException(); 
     } 

     public IMember FindMember(int memberId) 
     { 
      throw new NotImplementedException(); 
     } 

     public IMember FindMember(string memberName) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

namespace SharpDIC.Api 
{ 
    public class MemberLister 
    { 
     private IMemberFinder _finder; 

     // you would inject the concrete class MyImplementedClass 
     // here - bingo 
     public MemberLister(IMemberFinder finder) 
     { 
      this._finder = finder; 
     } 

     public void GetMyXml() 
     { 
      var result = _finder.FindAllMembers(); 
     } 
    } 
} 

[업데이트] - 반대 구현 IMember 인터페이스와 회원 클래스를 포함합니다. 건배

+0

감사! 나는 응답을 기다리는 동안 코드 작업을하고 있었으며 새로 고침을하고 답을 보았습니다. 내가 똑같은 것을 보는 것이 좋다. 나는 내가 그것에 매달려 있다고 생각한다. –

+0

yup - 밤에 깨어있게하지 않기를 바랍니다. 처음에는 똑같은 방식으로 :-) btw - 실제 응용 프로그램에서는 인터페이스의 Member 클래스도 구현할 것입니다. 나는 오래 지속 되겠지만, 이것은 회원 모델을보다 효과적으로 테스트 할 수있게 해줄 것입니다 ... –

+0

인터페이스를 구현하고 상속하지 마십시오. – Marcie

0

이제 인터페이스와 IOC 컨테이너의 효과적인 구현을 만들어 MemberLister에 의존성을 주입시켜야합니다. 그러면 여러분은 최첨단 "Decoupled"상태가됩니다.

이제 출력용으로 IMemberSerializer가 삽입 된 동일한 패턴을 Finder에 삽입하거나 IEnumerable을 반환하여이를 호출 코드에서 직렬화기에 주입 할 수 있습니다. 어느 쪽이든 괜찮은 편이지만 나중에 필자가 목록을 직렬화하지 않아야하므로 이후 옵션을 선호합니다.

+0

* "당신은 최첨단의"감 결합 "이 될 것입니다. * - 그건 나를 웃게했고, 당신의 의견에 감사드립니다. 이것은 내 패러다임을 전적으로 변화시키면서 파악하기가 어렵습니다. –

+0

당신이 사용할 때 당신은 그것을 많이 즐긴다. – VdesmedT

0

다음 단계는 IMemberFinder 인터페이스 (이 경우에는 XmlMemberFinder 구체 유형 - XmlMemberFinder.cs)를 구현하고 IoC 컨테이너의 추상화에 대해 구체적인 구현을 등록하는 것입니다.

이 콘크리트 유형을 동일한 어셈블리에 배치할지 또는 자체 어셈블리를 사용할지 여부는 솔루션을 분리하는 방법에 따라 달라지며 유형을 검색 가능하게하고 해당 유형을 검색 가능하게하려는 경우 (예를 들어 MEF와 같은 것을 사용하는 경우).

또한 FindMember 메소드가 멤버 유형 (IMember)의 추상화를 반환하지 않는 이유는 무엇입니까?

+0

솔직히 말하면, 나의 생각의 기차에서 논리적 인 일은 구체적인 Member 객체를 반환 할 것이다. IMember 인터페이스를 만들 것을 제안합니까? 인터페이스에 무엇이 들어가고이 제안 뒤에 어떤 추론이 있습니까? 이것은 어떤 유익을 가져올 것입니까? –

+0

예를 들어 IMember를 사용한 경우 단위 테스트에서 XmlMemberFinder를 계속 사용할 수 있지만 특정 멤버 ID 또는 이름에 대한 FindMember 메서드를 조롱하여 항상 특정 결과를 반환하지만 다른 멤버의 실제 XML 데이터를 반환합니다 이드의 이름. – devdigital

관련 문제