Не нарушает ли использование операторов неявного / явного преобразования шаблон единой ответственности в пользу DRY? - PullRequest
2 голосов
/ 23 февраля 2011

Мне нужно конвертировать между этими двумя классами, и я хочу поддерживать СУХОЙ, но не нарушать Шаблон единой ответственности ...

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
}

Подробнее

У меня есть несколько объектов Model в моем приложении ASP.NET MVC.Поскольку я работаю с хранилищем Azure, я вижу необходимость преобразования в объект ViewModel и AzureTableEntity и из него довольно часто.

Обычно я выполнял это левостороннее назначение переменных в моемконтроллер.

Q1

Помимо неявного / явного преобразования, должен ли этот код находиться в контроллере (x) или в текстовом тексте (y)?

Person <--> View <--> Controller.ConverPersonHere(x?) <--> StorageContext.ConvertPersonHere(y?) <--> AzurePersonTableEntity

Q2

Должен ли я сделать неявное или явное преобразование?

Q3

Какой объект должен содержатькод конверсии?


Обновление

Я также внедряю WCF в этом проекте и не уверен, как это повлияет на ваши рекомендации.Пожалуйста, смотрите также этот вопрос.

1 Ответ

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

Q1: контроллер.

Q2: преобразование вручную или с помощью инструмента отображения, такого как AutoMapper.

Q3: я бы поместил код для этого в преобразователь или преобразователькласс, как следующий.Обратите внимание, что IConverter является общим для всех конвертеров, а IPersonConverter просто существует, чтобы ваши контроллеры и локаторы услуг могли его использовать.

public interface IConverter<TModel, TViewModel>
{
    TViewModel MapToView(TModel source);
}

public interface IPersonConverter : IConverter<PersonEntity, Person>
{
}

public class PersonConverter : IPersonConverter
{
    #region IPersonConverter

    public Person MapToView(PersonEntity source)
    {
        return new Person
                   {
                       ID = source.ID,
                       Name = source.Name
                   };

        //or use an AutoMapper implementation
    }

    #endregion
}
...