Как использовать функцию GetById в c# - PullRequest
0 голосов
/ 22 апреля 2020

Я учусь c#. Я пытаюсь создать базовый список c в фиктивном репозитории (вместо того, чтобы сразу же извлекать данные из SQL). У меня есть список, содержащий автомобили и поля, такие как Id, Model, Make, описание и т. Д. c.

. Затем я пытаюсь создать метод в своем классе Car.CS, который получает автомобиль. по идентификатору Например, если я передам идентификатор автомобиля, он вернет другие сведения об автомобиле.

К сожалению, когда я запускаю консольное приложение, оно просто возвращает пустое значение в консоли? Может кто-нибудь сообщить мне, где я иду не так, пожалуйста?

Во-первых, у меня есть ICarRepository

namespace GeneralConsoleApp
{
    interface ICarRepository
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
    }
}

, а затем у меня есть MockCarRepository, в котором содержится список

namespace GeneralConsoleApp
{
    class MockCarRepository : ICarRepository
    {
        public IEnumerable<Car> Cars =>
            new List<Car>
            {
                new Car {Id = 1, Name="BMW", Price=23000.00M, Description="BMW car" }
            };

        public int Id { get; set; }
        public string Name {get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
    }
}

Далее мой Car.cs

namespace GeneralConsoleApp
{
    class Car
    {
        private readonly List<Car> CarList = new List<Car>();

        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public string Description { get; set; }

        public Car GetCarById(int Id)
        {
            return CarList.FirstOrDefault(z => z.Id == Id);

        }
    }
}

И, наконец, мой основной метод program.cs

namespace GeneralConsoleApp
{
    class Program
    {

        static void Main()
        {
            Car car = new Car();


            Console.WriteLine(car.GetCarById(1));

            Console.ReadLine();
        }
    }
}

Ответы [ 5 ]

1 голос
/ 22 апреля 2020

Ваш класс Car не использует MockCarRepository, но вместо этого имеет собственный пустой список (CarList).

Вы должны либо заполнить список в Car, либо использовать там репозиторий mock. ,

0 голосов
/ 22 апреля 2020

Несколько вопросов, касающихся разделения интересов. Ваша модель автомобиля просто должна моделировать свойства, связанные с автомобилем.

Аналогично, ваш CarRepository должен содержать только методы, необходимые для выполнения запросов к вашему хранилищу данных, например

GetCarById(int id)

или * 1006. *

IEnumberable<Car> FindByManufacturer(string manufacturer);

С точки зрения макетирования вашего хранилища данных вы должны создать класс специально для имитации, например, MockCarRepository, а затем во время выполнения вы можете создать его экземпляр. Причина, по которой это очень полезно, заключается в том, что, поскольку вы в конечном итоге программируете с использованием интерфейса ICarRepository, когда вы готовы использовать реальные данные, все, что вам нужно сделать, - это создать новую реализацию вашего ICarRepository, используя любой магазин, который вы хотите, собственный SQL Соединение, EntityFramework, CosmosDB et c. и просто измените, где вы создаете экземпляр своего типа, чтобы удовлетворить ICarRepository.

Я бы порекомендовал вам взглянуть на SOLID принципы проектирования - отличный ресурс ниже, который объясняет вещи гораздо лучше, чем я мог.

https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/may/csharp-best-practices-dangers-of-violating-solid-principles-in-csharp

С помощью нескольких небольших настроек вы можете использовать что-то вроде следующего.

namespace GeneralConsoleApp
{
interface ICarRepository
{
    Car GetCarById(int id);
}

class MockCarRepository : ICarRepository
{
    private List<Car> _mockCars;

    public MockCarRepository()
    {
        _mockCars = new List<Car>
        {
            new Car {Id = 1, Name="BMW", Price=23000.00M, Description="BMW car" }
        };
    }

    public Car GetCarById(int id)
    {
        return _mockCars.FirstOrDefault(v => v.Id == id);
    }
}

class SqlCarRepository : ICarRepository
{
    private readonly string _connectionString;

    public SqlCarRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public Car GetCarById(int id)
    {
        // use the _connectionString to create your database connection.
        var car = FROM DATABASE;
        return car;
    }
}

class Car
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        // All repositories should implement ICarRepository
        // meaning switching repo implementation is a one line change below, a DI container adjustment, or some sort of strategy pattern.
        ICarRepository mockRepo = new MockCarRepository();;

        var carFound = mockRepo.GetCarById(1);

        Console.WriteLine("Found car: " + carFound.Description);

        Console.ReadLine();

    }
}

}

0 голосов
/ 22 апреля 2020

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

ICarRepository repository= new MockCarRepository();
CarService carService= new CarService(repository);
Console.WriteLine(carService.GetCarById(1));

Вам необходимо добавить класс CarService, который может внедрить фиктивный репозиторий или реальный репозиторий базы данных, и изменить класс Car, чтобы он стал моделью.

    class CarService
    {
        private readonly ICarRepository _repository;
        public CarService(ICarRepository repository)
        {
           _repository=repository;
        }

        public Car GetCarById(int Id)
        {
            return _repositoy.GetCarById(id);    
        }
    }

    class Car
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public string Description { get; set; }       
    }
    interface ICarRepository
    {
        Car GetCarById(int Id);
    }
    class MockCarRepository : ICarRepository
    {
        public IEnumerable<Car> Cars =>
            new List<Car>
            {
                new Car {Id = 1, Name="BMW", Price=23000.00M, Description="BMW car" }
            };
        public Car GetCarById(int Id)
        {
            return Cars.First(z => z.Id == Id);    
        }
    }
0 голосов
/ 22 апреля 2020

CarList - пустой список, и это причина отсутствия вывода.

Измените основной вызов на

MockCarRepository car = new MockCarRepository();
Console.WriteLine(car.GetCarById(1).Name);

, и вы увидите разницу.

0 голосов
/ 22 апреля 2020

Ваша проблема в том, что у вашего класса Car есть список типов автомобилей, из которых вы возвращаете значение в консоль.

Вместо этого вам следует возвращать значение из репозитория.

nammespace GeneralConsoleApp
{
    class MockCarRepository : ICarRepository
    {
           public IEnumerable<Car> Cars => new List<Car>
           {
                   new Car {Id = 1, Name="BMW", Price=23000.00M, Description="BMW car" }
           };

           public Car GetCarById(int Id)
           {
             return Cars.FirstOrDefault(z => z.Id == Id);
           }
    }
    class Program
    {
        static void Main()
        {
            var Repository = new MockRepository();


            Console.WriteLine(Repository.GetCarById(1));

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