Шаблон репозитория - Выключите базу данных и включите файлы XML - PullRequest
0 голосов
/ 16 апреля 2010

Шаблон репозитория - Выключите базу данных и включите XML-файлы.

Hello

У меня есть проект asp.net MVC 2.0, и я следовал шаблону репозитория.

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

Я думал, что с помощью шаблона Repository было бы относительно легко переключать репозитории db и переключаться в версиях XML. Тем не менее, у меня есть реальная проблема при поиске решения.

Я пробовал LinqToXML, но затем столкнулся с проблемами при попытке вернуть элементы списка новостей, поскольку LinqToXML ToList возвращает Generic.List

Должен ли я отображать список XElement вручную в список новостей? Это просто кажется немного неуклюжим по сравнению с атрибутами LinqToSQL в классе News, а затем просто делает Table ..... ToList ();

Любое направление будет оценено.

Спасибо

Ответы [ 5 ]

3 голосов
/ 16 апреля 2010

У вас должно быть что-то вроде

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

и полагаться на интерфейсы. Тогда

IRepo repo;
try
{
     repo = new DbRepo();  //this should throw if there is no db connectivity
}
catch 
{
     repo = new XmlRepo();
}
0 голосов
/ 16 апреля 2010

Поскольку это только для вашего дальнейшего развития, вам действительно нужно упорство? Или вы могли бы использовать хранилище в памяти для удовлетворения ваших потребностей?

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.

   }  
}

У меня нет здесь компилятора, так что он принят как есть, но, надеюсь, может помочь вам продолжить разработку и не беспокоиться о Linq to Xml

0 голосов
/ 16 апреля 2010

Должен ли я отображать список XElement вручную в список новостей?

Точно. Репозитории должны возвращать список, а не сущности Linq to SQL или XElements

0 голосов
/ 16 апреля 2010

Возможно, вы уже делаете это ...

Я предлагаю вам создать интерфейс IFooRepository.Исходя из этого, вы можете иметь FooRepository (содержащий ваш доступ к данным linq to SQL) и FooMockRepository (где у вас есть доступ к фиктивным данным linq to XML).Если вы следуете POCO (что-то вроде linq to SQL еще не очень хорошо), вы можете использовать automapper для сопоставления ваших объектов L2S с вашими объектами POCO.Это затем дает вам разделение, которое вам необходимо, чтобы иметь возможность также использовать automapper в вашем FooMockRepository для возврата объектов POCO (через автоматическое преобразование) из ваших запросов linq to XML.Все, что осталось, это использовать StructureMap (или другой IoC), чтобы выбрать и выбрать подходящий вам конкретный тип с синтаксисом, подобным ...

IFooRepository fooRepository = ObjectFactory.GetInstance ();

Затем в скриптах конфигурации вашей среды вы можете настроить IoC, чтобы получить соответствующий репозиторий для dev против более продвинутой среды.

0 голосов
/ 16 апреля 2010

Просто проанализируйте с помощью Linq-To-XML. Что-то вроде:

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