Создание / разрешение списка объектов с помощью Autofac

#c# #autofac

#c# #autofac

Вопрос:

Я изучаю IoC и Autofac, поэтому мой вопрос довольно простой, но я не смог найти удовлетворительного ответа. У меня есть эти тестовые классы:

DataModel.cs

 public class DataModel : IDataModel
{
    public int PosX { get; set; }
    public int PosY { get; set; }
    public string Name { get; set; }

    public DataModel(int posx, int posy, string name)
    {
        PosX = posx;
        PosY = posy;
        Name = name;
    }
    public void WriteName()
    {
        Console.WriteLine($"Hello, my name is "{Name}". Nice to meet you!");
    }
    public void WritePosition()
    {
        Console.WriteLine($""{Name}": Position of X axis is {PosX} and position of Y axis is {PosY}");
    }

}
  

BusinessLogic.cs

 public class BusinessLogic : IBusinessLogic
{
    ILogger _logger;
    IList<IDataModel> _dataModels;
    public BusinessLogic(ILogger logger, IList<IDataModel> dataModels)
    {
        _logger = logger;
        _dataModels = dataModels;
    }

    

    public void ProcessData()
    {

        
        _logger.Log("Starting the processing of devices data.");
        _logger.Log("Processing the data...");
        foreach (var model in _dataModels)
        {
            model.WriteName();
            model.WritePosition();
        }
        
        _logger.Log("Finished processing the data.");
    }
}
  

Теперь, как вы можете видеть, ctor из BusinessLogic нуждается в коллекции IDataModel. Вопрос в том, как мне создать список интерфейсов, хранящихся в контейнере, для достижения чего-то подобного:

 for(int x = 0; x <=7; x  )
{
  for(int y = 0; y <= 7; y  )
  {
    list.Add(new DataModel(x,y,$"Object {x}{y}"));
  }
}
  

Возможно, я неправильно понял всю идею. Я благодарен за каждый ответ. Спасибо!

Комментарии:

1. Обычно вы не регистрируете классы «данных» в контейнере. Обычно вы регистрируете какую-либо другую службу, например репозиторий, который может доставлять объекты данных. Вы можете зарегистрировать несколько объектов с помощью RegisterInstance или как Func для создания одного, когда это необходимо, но обычно это также будут службы, например, два WeatherService экземпляра для разных местоположений.

Ответ №1:

Обратите внимание, что IList<IDataModel> dataModels это не сервис, подлежащий разрешению. Я не уверен, что это лучший способ, однако вам нужно создать сервис (например IDataInitializer ), предоставляющий метод или объект для IList<IDataModel> dataModels , зарегистрировать его в IServiceCollection или IOC контейнере в Startup.cs , а затем он может быть разрешен в других сервисах и классах.

Вот один из примеров:

 public interface IDataInitializer
{
    IList<IDataModel> GetDataModel();
}
public class DataInitializer : IDataInitializer
{
    private IList<IDataModel> _dataModels;
    public DataInitializer()
    {
        for (int x = 0; x <= 7; x  )
        {
            for (int y = 0; y <= 7; y  )
            {
                _dataModels.Add(new DataModel(x, y, $"Object {x}{y}"));
            }
        }
    }
    public IList<IDataModel> GetDataModel()
    {
        return _dataModels;
    }

}

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDataInitializer>(new DataModel());
}
  

Комментарии:

1. Спасибо! Ты кое-что прояснил для меня. Теперь я вспоминаю, что видел аналогичную проблему в разделе часто задаваемых вопросов документации Autofac. Я просто неправильно это истолковал. Спасибо!