Отображать элементы из БД с использованием MVC и домен управляемая конструкция


Я начинаю проект, чтобы применить на практике уроки в "Чистый код" Роберта "дядя Вася" Мартин.

Проект представляет собой сайт, который отображает названия предметов в таблице ДБ. Он использует рамки ASP.NET MVC и я старался изо всех сил, чтобы отдельные домены в модели. Я использовал тестирование дизайна, но есть много кода, поэтому я оставил его здесь.

Это очень простой, но он использует много понятий, и я хотел бы убедиться, что я понял все правильно, прежде чем добавлять сложности.

Я заинтересован в обучении, как я мог бы лучше следил за гибкой концепции, даже если перебор за это маленькое приложение (или любое другое консультация хорошего взять). В частности, я чувствую, что контроллер делает много логики для одной функции (и трудно модульного теста).

DataAccessLayer.dll

Клиента.в CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataAccessLayer.DataTransferObject
{
    public class Customer
    {
        public string Name { get; set; }
        public Customer(string inputName)
        {
            Name = inputName;
        }
    }
}

ICustomerRepository.в CS

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataAccessLayer.Repositories.Interfaces
{
    public interface ICustomerRepository
    {
        ICollection<DataTransferObject.Customer> GetAllCustomerss();
    }
}

SQLPlusCustomerRepository.в CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataAccessLayer.DataTransferObject;
using System.Data;

namespace DataAccessLayer.Repositories
{
    public class SQLPlusCustomerRepository : Interfaces.ICustomerRepository
    {
        private IDbConnection connection;
        public SQLPlusCustomerRepository(IDbConnection inputConnection)
        {
            connection = inputConnection;
        }
        public ICollection<Customer> GetAllCustomers()
        {
            ICollection<Customer> resultList = new List<Customer>();

            const string getAllCustomerQuery = "SELECT NAME FROM CUSTOMERS";

            using (connection)
            {
                connection.Open();
                IDbCommand dbCommand = connection.CreateCommand();
                dbCommand.CommandType = CommandType.Text;
                dbCommand.CommandText = getAllCustomerQuery;

                IDataReader dbDataReader = dbCommand.ExecuteReader();
                while (dbDataReader.Read())
                {
                    resultList.Add(new Customer(dbDataReader.GetValue(0).ToString()));
                }
                return resultList;
            }
        }
    }
}

CustomerDisplay (Сайт)

Клиента.в CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace CustomerDisplay.Models
{
    public class Customer
    {
        public string Name { get; set; }
        public Customer(DataAccessLayer.DataTransferObject.Customer dtoCustomer)
        {
            Name = dtoCustomer.Name;
        }
    }
}

HomeController.в CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using XXX.SQLplus;

namespace CustomerDisplay.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            SQLplusConnection connection = new SQLplusConnection(
                Properties.Settings.Default.connectionString
                );
            DataAccessLayer.Repositories.SQLPlusCustomerRepository repository =
                new DataAccessLayer.Repositories.SQLPlusCustomerRepository(connection);

            ICollection<Models.Customer> viewItemsList = new List<Models.Customer>();

            foreach (DataAccessLayer.DataTransferObject.Customer dtoCustomer in repository.GetAllCustomers()){
                viewItemsList.Add(new Models.Customers(dtoCustomers));
            }
            return View(viewItemsList);
        }
    }
}

Индекс.cshtml по

@model  ICollection<CustomerDisplay.Models.Customer>

@foreach(CustomerDisplay.Models.Customer Customer in Model)
{
    <span>@Customer.Name</span>
}


124
1
задан 21 февраля 2018 в 01:02 Источник Поделиться
Комментарии
1 ответ

Даем имена для параметров, не бессмысленно префикса, например "inputName" или "dtoCustomer".


Четыре заглавные буквы подряд-как в "команду sqlplus" -- идет против Microsoft в правилах кодирования. Это выражается в старой версии:


Сделать заглавной только первый символ сокращения с трех или более символов, за исключением первого слова идентификатора в стиле Camel.


Ваш GetAllCustomers() метод 20 строк за то, что можно сделать гораздо проще и аккуратнее при использовании ОРМ как лицо основу или щеголь. ИМХО вы должны избегать написания кода ADO.NET если у вас есть действительно хорошая причина, чтобы сделать это.

У меня тоже складывается впечатление, что вы не всегда правильно очистить читателям данных и т. д.


Есть причина, почему ваш код изобилует имя класса префиксы, такие как "интерфейсы." или "DataAccessLayer.DataTransferObject".? Те сделать ваш код труднее читать, ИМХО.


Я не понимаю, почему вы создаете SQLplusConnection в ваш контроллер, только чтобы пройти к SQLPlusCustomerRepository? Почему бы не позволить репозиторий разобраться со всем, что вместо того, чтобы смешивать ее за все места?


В foreach преобразование DTO для модели можно сделать гораздо более элегантно в LINQ.


Есть 100+ строк кода здесь, и все, что вы сделали берется одно поле из одной таблицы и отображается. Я все в пользу отделения, но для меня это выглядит как массивный перебор и он, скорее всего, очень скоро будет очень громоздким. Это выглядит как код, который был бы едва приемлемо десять лет назад, в эти дни он чувствует себя устаревшим и раздутой.

1
ответ дан 21 февраля 2018 в 04:02 Источник Поделиться