Если WCF находится в приложении MVC, следует ли ему использовать контроллер для доступа к базе данных, чтобы сохранить «СУХОЙ» - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть приложение MVC, которое обращается к SQL и Windows Azure.Логический поток выглядит следующим образом:

Person <--> View <--> Controller.ConvertPersonHere(x) <--> StorageContext.DoDataAction <--> AzurePersonTableEntity

ConvertPersonHere является ответом на этот вопрос переполнения стека , и он преобразует сущность модели в сущность хранилища

public class Person
{
    public string Name {get;set;}
    public int ID {get;set;}
}

public class PersonEntity : TableServiceEntity
{
    public string Name {get;set;}
    public int ID {get;set;}

    // Code to set PartitionKey
    // Code to set RowKey
}
  1. Теперь, когда я добавляю WCF в микс, как мне получить доступ к функциям данных?Предположим, у меня в настоящее время есть метод для .Save(Person) в контроллере и я хочу Save(Person) из моего вызова WCF.

  2. Нужно ли абстрагировать действия с данными в контроллере?

Ответы [ 3 ]

3 голосов
/ 23 февраля 2011

Я бы осуществил рефакторинг кода следующим образом: перенесите функциональность для преобразования из Person в PersonEntity и наоборот в отдельный маппер, перенесите функции сохранения в отдельный репозиторий, а также перенесите код контроллера для вызова маппера и репозитория в отдельный сервис. .
Поэтому методы в вашем контроллере будут выглядеть примерно так:

public ActionResult SomeMethod(Person person)
{
    if (ModelState.IsValid)
    {
        _personService.Save(person)
        return View("Success");
    }
    return View();
}

И в вашем сервисе WCF вы сможете повторно использовать код. Чтобы проверить классы в WCF с помощью атрибутов DataAnnotations, вы можете использовать подход, подобный следующему - http://blog.jorgef.net/2011/01/odata-dataannotations.html

2 голосов
/ 24 февраля 2011

В этом примере, если ваш проект Mvc пропал и заменен проектом Wpf, остальные ваши функции по-прежнему доступны. Если у вас есть оба проекта, они могут ссылаться на основные функции. Имейте реализацию, которая не имеет отношения к UI (MVC или WPF) в других проектах. Таким образом, эти проекты пользовательского интерфейса могут ссылаться на эту функциональность.

public interface IConverter<TDataModel, TModel> { TModel MapToDomain(TDataModel source);}
public interface IPersonConverter : IConverter<PersonEntity, Person> { }
public interface IPersonRepository { Person GetById(int id); }

public class PersonConverter : IPersonConverter
{
    public Person MapToDomain(PersonEntity source)
    {
        return new Person { ID = source.ID, Name = source.Name };
        //or use an AutoMapper implementation   
    }
}

public class PersonRepository : IPersonRepository
{
    private readonly IPersonConverter _personConverter;

    public PersonRepository(IPersonConverter personConverter)
    {
        _personConverter = personConverter;
    }

    public Person GetById(int id)
    {
        PersonEntity personEntity = new PersonEntity(); //get from storage
        return _personConverter.MapToDomain(personEntity);
    }
}

public class MvcController
{
    private readonly IPersonRepository _personRepository;

    public MvcController(PersonRepository personRepository)
    {
        _personRepository = personRepository;
    }

    public ActionResult SomeMethod(int id)
    {
        Person person = _personRepository.GetById(id);

        //make your view model based on the person domain model
        //with another convert / map, to fit view as personForm
        //(if this is overkill you can use person).

        return View(personForm);
    }
}

Проект Mvc или Wpf

  • PersonForm (пользовательская модель)
  • Контроллер или класс Wpf
  • Person -> Конвертер PersonForm
  • Элемент списка

Основной проект

  • Человек
  • IPersonRepository

Инфраструктурный проект

  • Персональный репозиторий
  • Лицо субъекта
  • Таблица Azure Person
  • Контекст хранения
0 голосов
/ 24 февраля 2011

Я знаю, что это касательная, но если вы смешиваете WCF и ASP.NET MVC, вы должны, по крайней мере, знать о OpenRasta .Хорошее начало - это подкаст Herding Code с основным автором .

(Нет, это даже не предназначено для ответа на ваш актуальный вопрос!)

...