#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. Я просто неправильно это истолковал. Спасибо!