Grace Dependency Injection breaks project

178
23 декабря 2021, 20:10

Я начал писать проект с нуля, поэтому я хотел реализовать DependencyInjection. Выбрал Grace, потому что он уже реализован на старом проекте, его писал не я, так что теперь я столкнулся с сложностями. Пытался написать DependencyInjection в Autofac, но меня не устраивает прописка зависимостей в ConfigureServices или в main. Поэтому я решил остановиться на Grace.

Project setting: ASP.NET Core Web Application, Core 2.2, Grace 7.0.1

DependencyInjection
public class GraceContainer : IContainer
    {
        private DependencyInjectionContainer _container;
        private readonly IConfiguration _configuration;
        internal GraceContainer(IConfiguration configuration)
        {
            _configuration = configuration;
            _container = ConfigureContainer(configuration);
        }
        private static DependencyInjectionContainer ConfigureContainer(IConfiguration configuration)
        {
            var container = new DependencyInjectionContainer();
            ConfigureContainer(container, configuration);
            return container;
        }
        public static void ConfigureContainer(IInjectionScope scope, IConfiguration configuration)
        {
            scope.Configure(c => c.ExportInstance(configuration).As<IConfiguration>());
            scope.Configure(c => c.Export<ProjectRepository>().As<IProjectRepository>());
            scope.Configure(c => c.Export<ProjectService>().As<IProjectService>());
            // possible fix for https://github.com/ipjohnson/Grace/issues/116
            scope.Configure(c =>
                c.ExcludeTypeFromAutoRegistration("Microsoft.AspNetCore.DataProtection.RegistryPolicyResolver"));
        }
        public T Get<T>()
        {
            return _container.Locate<T>();
        }
        public void Replace<I, T>()
        {
            _container.Dispose();
            _container = ConfigureContainer(_configuration);
            _container.Configure(c => c.Export<T>().As<I>());
        }
        public void Replace<T>(T instance)
        {
            _container.Dispose();
            _container = ConfigureContainer(_configuration);
            _container.Configure(c => c.ExportInstance(instance).As<T>());
        }
        public object GetService(Type serviceType)
        {
            return _container.Locate(serviceType);
        }
    }
Startup
public void ConfigureContainer(IInjectionScope scope)
        {
            GraceContainer.ConfigureContainer(scope, Configuration);
            scope.SetupMvc();
        }
Program
public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseGrace()
                .UseStartup<Startup>();
    }
Controller
[Produces("application/json")]
    [Route("api/auth")]
    public class ServiceController : Controller
    {
        private readonly IProjectRepository _projectRepository;
        private readonly IProjectService _projectService;
        public ServiceController(IProjectRepository projectRepository, IProjectService projectService)
        {
            _projectRepository = projectRepository;
            _projectService = projectService;
        }
        /// <summary>
        /// Repository List
        /// </summary>
        [HttpGet("api/repository_from_git_hub")]
        public async Task<IActionResult> GetGitHubRepositories(string login, DateTime startDate = new DateTime()) =>
            new OkObjectResult(await _projectService.ProjectPages(login, startDate));
    }

И в итоге что я получил после запуска

Помогите пожалуйста, кто знает как решить эту проблему, дебаг мнне ничего не показал.

P.S. Swagger работает з пустыми ендпойнтами

Answer 1

Ломает Сваггер не Grace, а то что в контроллере по дефолту присваювается DateTime startDate = new DateTime()

[HttpGet("api/repository_from_git_hub")]
        public async Task<IActionResult> GetGitHubRepositories(string login, DateTime startDate) =>
            new OkObjectResult(await _projectService.ProjectPages(login, startDate));
READ ALSO
Неравномерное изменение значения DOTween Unity3D

Неравномерное изменение значения DOTween Unity3D

Столкнулся с тем, что DOTween неравномерно изменяет значение

194
Ошибка при занесении данных в базу

Ошибка при занесении данных в базу

Пытаюсь реализовать форму регистрации для БДПосле запуска Winform выдает ошибку

82
Как проверить пользователя на админ права Телеграм C#?

Как проверить пользователя на админ права Телеграм C#?

Пишу админ бота для Телеграма и мне нужно проверить пользователя на админ права, и если он не просто участник а админ, то код должен работать,...

194
Объясните пожалуйста, как работает Update в Entity Framework

Объясните пожалуйста, как работает Update в Entity Framework

Я не понимаю, как работать с Entity FrameworkПосле Laravel и его ОРМ мне это кажется совершенно недружелюбной технологией с кучей граблей

192