Внедрение зависимостей через конструктор создает только один экземпляр - PullRequest
0 голосов
/ 09 января 2020

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

Возможно ли другое решение?

Спасибо за все ответы.

Пример это не на 100% тот же код (потому что мой список также инициализируется конструктором):

 class GetUserFirstOption
        {
            IUser _user;
            GetUserFirstOption(IUser user)
            {
                _user = user;
            }

            public void UsersInCompany()
            {
                //Here is connection to the database where i upload 500 records to UsersFromDataBase

                List<User> UsersInCompany = new List<User>();
                foreach (var userDB in UsersFromDataBase)
                {
                    _user.Name = userDB.Name;
                    _user.SecondName = userDB.SecondName;
                    //...

                    UsersInCompany.Add(_user);
                    //Here i have 500 users but all same

                }
            }
        }



      class GetUserSecondOption
        {
            public void UsersInCompany()
            {
                List<User> UsersInCompany = new List<User>();
                foreach (var userDB in UsersFromDataBase)
                {
                    _user = Factory.CreateNewUser();
                    _user.Name = userDB.Name;
                    _user.SecondName = userDB.SecondName;
                    //...

                    UsersInCompany.Add(_user);
                    //I have 500 unique records but i do not need to it dependency injection

                }
            }
        }



class Factory
{
   public static IGetUserSecondOption CreateUserInCompany()
   {
      return new GetUserSecondOption(UserFactory.CreateNewUser());
   }
}

class UserFactory
{
  public static IUser CreateNewUser()
  {
      return new User();
  }
}


class Program
{
  public static Main(string []args)
  {            
    IGetUserSecondOption Get = Factory.Factory.CreateUserInCompany();
    Get.UserInCompany();
   }        
}

Ответы [ 2 ]

1 голос
/ 10 января 2020

Наличие фабрики здесь похоже на запах кода, и, на мой взгляд, на инжиниринг.

Ссылка Абстрактные фабрики - это запах кода

Ссылка на фабрику статически создает жесткая связь, которая может привести к нежелательным результатам при попытке провести модульное тестирование в изоляции. Класс также не является подлинным в отношении того, что ему нужно для выполнения своей разработанной функции.

Ссылка Принцип явных зависимостей

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

public void UsersInCompany() {
    List<User> UsersInCompany = new List<User>();
    foreach (var userDB in UsersFromDataBase) {
        User user = new User() {
            Name = userDB.Name,
            SecondName = userDB.SecondName,
            //...
        };
        UsersInCompany.Add(user);    
    }
}

Существуют также такие службы, как Automapper это может быть использовано для упрощения процесса

public class UsersService {
    private readonly IMapper mapper;

    public UsersService(IMapper mapper) {
        this.mapper = mapper
    }

    public List<User> UsersInCompany() {            
        List<User> UsersInCompany = new List<User>();
        foreach (var userDB in UsersFromDataBase) {
            User user = mapper.Map<User>(userDb);
            UsersInCompany.Add(user);
        }
        return UsersInCompany;
    }
}

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

1 голос
/ 10 января 2020

Вместо введения пользователя в ваш l oop создайте фабрику, которая создает пользователей. Тогда вы можете ввести фабрику вместо:

class GetUserSecondOption
{
    public GetUserSecondOption(UserFactory factory) { this.Factory = factory; }
    public void UsersInCompany()
    {
        List<User> UsersInCompany = new List<User>();
        foreach (var userDB in UsersFromDataBase)
        {
            var user = this.Factory.CreateNewUser();
            user.Name = userDB.Name;
            user.SecondName = userDB.SecondName;
            //...

            UsersInCompany.Add(user);    
        }
    }
}
...