Разрешение круговой/рекурсивной зависимости с инъекцией зависимостиC#

Место общения программистов C#
Ответить
Anonymous
 Разрешение круговой/рекурсивной зависимости с инъекцией зависимости

Сообщение Anonymous »

Скажи, что у меня есть этот интерфейс: < /p>

Код: Выделить всё

public interface IExample
{
string GetSupportedExtension();

void DoWork(Stream input);
}
< /code>
конкретная реализация, как: < /p>
public class PdfExample : IExample
{
public string GetSupportedExtension() => ".pdf";

public void DoWork(Stream input)
{
// Do something with the PDF
}
}
Factory/Resolver:

Код: Выделить всё

public class ExampleResolver(IEnumerable examples) : IExampleResolver
{
public IExample? Resolve(string extension)
{
return examples.FirstOrDefault(e => e.GetSupportedExtension() == extension);
}
}
< /code>
используется в контроллере, как это: < /p>
[ApiController]
public class ExampleController(IExampleResolver resolver) : ControllerBase
{
[HttpPost("/")]
public async Task DoWork([FromForm] IFormFile file)
{
string extension = Path.GetExtension(file.FileName).ToLower();
IExample? example = resolver.Resolve(extension);

if (example == null)
{
return BadRequest();
}

example.DoWork(file.OpenReadStream());

return Ok();
}
}
, который, по моему мнению, была структурой класса/интерфейса, которая имела смысл и пусть DI -структура создает для меня объекты, однако есть проблема, если у меня есть другая конкретная реализация:

Код: Выделить всё

public class ZipExample(IExampleResolver resolver) : IExample
{
public string GetSupportedExtension() => ".zip";

public void DoWork(Stream input)
{
// Load zip from stream

foreach (var file in zip)
{
IExample example = resolver.Resolve(file.Extension);
example.DoWork(file.GetInputStream());
}
}
}
Теперь существует круговая ссылка, так как решатель нуждается в построении Zipexample, но Zipexample также нуждается в резолювере. /> Я также знаю, что могу пройти в IserviceProvider < /code>, но прочитал, что это была плохая практика, поскольку он скрывает зависимости класса, так что я думаю, я хочу посмотреть, есть ли другое решение или что люди рекомендуют? Спасибо

Подробнее здесь: https://stackoverflow.com/questions/797 ... -injection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»