2010-04-16 2 views
0

저장소 패턴 - 데이터베이스를 전환하고 XML 파일을 전환하십시오. 안녕하세요저장소 패턴 - 데이터베이스를 전환하고 XML 파일을 전환하십시오.

가 나는 asp.net MVC 2.0 프로젝트를하고 난 저장소 패턴을 따랐다.

주기적으로 데이터베이스 서버에 대한 액세스가 끊어 지므로 개발을 계속 진행하기 위해 다른 메커니즘 (XML 파일)을 갖고 싶습니다. 불행하게도 DB의 로컬 버전을 가질 수 없습니다!

리포지토리 패턴을 사용하여 db 리포지토리를 전환하고 XML 버전으로 전환하는 것이 상대적으로 쉽다고 생각했습니다. 그러나 솔루션을 찾는 중대한 문제가 있습니다.

나는 LinqToXML 시도하지만 나는 손으로 뉴스 목록을 통해 XElement를 목록을 매핑해야 LinqToXML ToList이

Generic.List

을 반환로 뉴스 항목의 목록을 반환하려고 문제로 실행했다? News 클래스의 LinqToSQL 속성과 비교해 보았을 때 조금 어색한 것처럼 보였습니다. 그런 다음 단순히 테이블을 작성했습니다 ..... ToList();

어떤 방향으로 생각하겠습니다.

감사합니다.

답변

0

Linq-To-XML을 사용하여 구문 분석합니다. 당신은

public interface IRepo 
{ 
     //methods for data 
} 
public class DbRepo : IRepo 
{ 
     // IRepo methods for db access 
} 
public class XmlRepo : IRepo 
{ 
     // IRepo methods for xml access 
} 

같은 것을해야 및 인터페이스에 의존

(from a in b 
where b.Element("type").Value == "test" 
select new c(){d=b.Element("prop").Value}).ToList(); 
+0

이것은 효과가있다. 그러나 이것은 모든 c 속성을 b 속성에 매핑해야한다는 것을 의미한다. 이것은 c 클래스가 이미 속성에 Linq.Mapping.ColumnAttribute를 가지고 있기 때문에 LinqToSQL과 관련이 없어도됩니다. LinqToXML이 멋지거나 실제로 클래스의 Linq 특성을 사용할 수 있는지 궁금합니다. –

3

:처럼 뭔가. 그런 다음

IRepo repo; 
try 
{ 
    repo = new DbRepo(); //this should throw if there is no db connectivity 
} 
catch 
{ 
    repo = new XmlRepo(); 
} 
0

당신은 내가 당신이 IFooRepository 인터페이스를 만들 제안 ...

이미이 중 일부를 수행 할 수있다. 그걸로 FooRepository (linq에서 SQL 데이터 액세스 수용) 및 FooMockRepository (XML 데이터 접근에 대한 linq를 가짐)를 가질 수 있습니다. POCO (SQL에 대한 linq이 아직 좋지 않다)를 따르는 경우에는 자동 매퍼를 사용하여 L2S 객체를 POCO 객체에 매핑 할 수 있습니다. 이렇게하면 FooMockRepository에서 자동 매기기를 사용하여 linq에서 XML 쿼리로 POCO 객체 (자동 매퍼를 통해)를 반환 할 수 있어야합니다. 남은 것은 StructureMap (또는 다른 IoC)을 사용하여 다음과 같은 구문을 사용하여 적절한 구체 유형을 선택하고 선택하는 것입니다.

IFooRepository fooRepository = ObjectFactory.GetInstance();

그런 다음 환경 구성 스크립트에서 개발자를위한 적절한 저장소를 얻도록 IoC를 구성 할 수 있습니다.

0

XElement 목록을 뉴스 목록에 직접 매핑해야합니까?

정확히. 리포지토리는 Linq to SQL 엔터티 또는 XElements가 아닌 List를 반환해야합니다.

+0

Thanks Mel - 저장소가 목록을 반환합니다. 내 질문은 어떻게 그 목록을 만드는 것입니다. 아래의 Oskar에게 의견보기. –

0

이것은 단지 지속적인 개발을위한 것이기 때문에 진정성이 필요합니까?또는 귀하의 요구를 충족시키기 위해 메모리 리포지토리를 사용할 수 있습니까?

public interface IFoo 
{ 
    IList<News> GetNews(); 
} 

public class InProcFoo : IFoo 
{ 

    private static IList<News> news; 

    public InProcFoo() 
    { 
     news = new List<News>(); 
     news.Add(new News()); 
    } 

    public IList<News> GetNews() 
    { 
     return news; 
    } 
} 

당신은 아마 당신은 단순히 데이터 계약 시리얼 라이저를 사용할 수 지속성이 필요한 경우가

public class DataContractFoo :IFoo, IDisposable 
{ 
     private static IList<News> news; 
    public DataContractFoo() 
    { 
    //Load up news from a serialized news list from some xml file. 

    } 
     public IList<News> GetNews() 
     { 
      return news; 
     } 
    public void Dispose() 
    { 
     //Serialize news via the data contract serializer to your drive. 

    } 
} 

내가이 그대로 촬영 때문에 여기 컴파일러를 해달라고하지만, 희망이 도움이 필요 무엇을 얻을 수 있습니다 당신은 개발을 계속하고 XML에 Linq에 대해 걱정할 필요가 없다