Поскольку это похоже на идеальный подход к микросервисам (похожий на то, что моя команда делает прямо сейчас), я бы создал клиентскую сборку, которая может использовать ваш API, тот, который содержит ваш TodoController, если вы определяете контракт и интерфейс, для этого API, вы можете зарегистрировать его в другой своей сборке, поскольку это промежуточное ПО, а также вы можете имитировать это поведение в своих модульных тестах.
Итак, как я уже сказал, вы можете внедрить свой клиент в метод ConfigureServices, вы можете создать:
public static IServiceCollection AddTodoRestClient(this IServiceCollection services)
{
services.AddSingleton<ITodoRestClient, TodoRestClient>();
return services;
}
Также учтите, что вам нужно будет указать enpoint, поэтому это может выглядеть так:
public static IServiceCollection AddConfiguredTodoClient(this IServiceCollection services, string todoEndpoint)
{
AddTodoClient(services);
ITodoRestClient todoRestClient = services.BuildServiceProvider().GetService<ITodoRestClient>();
// Imagine you have a configure method...
todoRestClient.Configure(services, todoEndpoint);
return services;
}
Вы можете создать эти методы в классе TodoRestClientInjector и использовать их в методе Configure при запуске.
Я надеюсь, что это помогает
--- ПОДРОБНЕЕ, ЧТОБЫ ОТВЕЧАТЬ НА КОММЕНТАРИИ ---
Для меня TodoClient — это клиентская библиотека Rest, которая реализует вызовы ToDo API (я отредактировал предыдущий код, чтобы он был TodoRestClient), такие методы, как, например, CreateTodoItem(TodoDto todoItem), реализация которого будет вызывать TodoController.Post([FromBody] item) или GetTodos(), который вызовет TodoController.Get() и т.д. и т.п....
Что касается точек... Этот подход подразумевает наличие (по крайней мере) двух разных приложений (приложений .NET Core), с одной стороны, приложения ASP NET Core, в котором есть ваш TodoController, а с другой стороны, консольное приложение или другое приложение ASP NET. Core API, в каком классе запуска вы будете выполнять настройку клиента Rest (клиент Todo Rest)...
В подходе микросервисов с использованием docker в среде разработки вы будете использовать docker-compose-yml, но в традиционном подходе вы будете использовать конкретные порты для определения конечных точек...
Итак, представьте, что во второй службе у вас есть контроллер, которому нужно использовать TodoController, для достижения которого я буду использовать описанный выше подход, и «SecondController» будет выглядеть так:
public class SecondController : Controller
{
private readonly SecondContext _context;
private readonly TodoRestClient _todoRestClient;
public TodoController(SecondContext context, ITodoRestClient todoRestClient)
{
_context = context;
_todoRestClient= todoRestClient;
}
// Whatever logic in this second controller... but the usage would be like:
_todoRestClient.GetTodos()
}
Несколько заключительных советов: важно свести к минимуму вызовы между службами, потому что это увеличивает задержку, и все больше и больше, если это происходит в каскаде. Также рассмотрите использование Docker, выглядит сложно, но его довольно легко запустить, и, действительно, считается, что он используется в сценариях, которые вы представили, и в решениях, подобных моему.
Опять же, я надеюсь, что это поможет.
Хуан
person
Juan
schedule
09.08.2017