Dependencyinjection: services.AddTransient рдХрд╛ рд╕рдВрджрд░реНрдн рдХреНрдпрд╛ рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдирд╡ре░ 2017  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: aspnet/DependencyInjection

рдирдорд╕реНрддреЗ, рдореБрдЭреЗ рдирд┐рдореНрди рд╕рдорд╕реНрдпрд╛ рд╣реИ

    public void ConfigureServices(IServiceCollection services)
    {
        var assemblies = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(x => x.GetTypes())
            .ToArray();

        RegisterRepositories(ref services, assemblies);
    }

    private void RegisterRepositories(ref IServiceCollection services, Type[] assemblies)
    {
        var interfaceT = typeof(IRepository);
        foreach (var t in assemblies.Where(x => interfaceT.IsAssignableFrom(x) && x != interfaceT))
        {
            services.AddTransient(t);
        }
    }

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЖрдИрд░рд┐рдкреЛрдЬрд┐рдЯрд░реА (рдорд╛рд░реНрдХрд░/рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ! рдореБрдЭреЗ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЕрдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдЕрдкрд╡рд╛рдж: 'MyProject.Core.Repositories.MenuRepository' рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде 'MyProject.Controllers.MenuController' рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордпред

рдореЗрд░рд╛ рдореЗрд░рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдХреМрди рд╕рд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рднрдВрдбрд╛рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рддреЛ DI рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ

   public void ConfigureServices(IServiceCollection services)
    {
        var assemblies = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(x => x.GetTypes())
            .ToArray();

        // Register Repositories
        var interfaceT = typeof(IRepository);
        foreach (var t in assemblies.Where(x => interfaceT.IsAssignableFrom(x) && x != interfaceT))
        {
            services.AddTransient(t);
        }
    }

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@SherifRefaat рд╕рдВрднрд╡рддрдГ, рд▓реЛрдб рдХреА рдЧрдИ рдЕрд╕реЗрдВрдмрд▓реА рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрднрд╡ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЧреИрд░ рдирд┐рдпрддрд╛рддреНрдордХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдЧрд▓рддреА рд╣реИред

рдЬрдм рдЖрдк ConfigureServices рдореЗрдВ typeof(IRepository) рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ JITed рд╡рд┐рдзрд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рднреА 7 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ/рдкреНрд░рд╢реНрди рд╣реИрдВ:

  1. ref рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ services рдкреИрд░рд╛рдореАрдЯрд░ рдХрднреА рднреА рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
  2. MenuController рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?
  3. MenuRepository рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ?

@Eilon рдпрд╣рд╛рдВ рдПрдХ рдкреВрд░реНрдг рдХреЛрдб рд╡рд╛рд▓рд╛ рднрдВрдбрд╛рд░ рд╣реИ:
https://github.com/SherifRefat/aspnet-DependencyInjection-Issue-612

@SherifRefaat рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЛрдб рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдерд╛? рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЛрдИ рд▓реЛрдбреЗрдб рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрд╕реЗрдВрдмрд▓реА рд╕рднреА рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рд╣реА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ

var assemblies = AppDomain.CurrentDomain.GetAssemblies();

рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ MyProject.Core рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИред

@davidfowl рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм GetAssemblies() рдХреЛ IRepository рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рддрдм рднреА рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП MyProject.Core рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдБ?

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            var projectTypes = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(x => x.GetTypes())
                .ToList();

            RegisterFromBaseType(services, typeof(IRepository), projectTypes);
        }

        private void RegisterFromBaseType(IServiceCollection services, Type type, List<Type> allTypes)
        {
            foreach (var t in allTypes.Where(x => type.IsAssignableFrom(x) && x != type))
            {
                services.AddTransient(t);
            }
        }

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, @davidfowl рдиреЗ рдореЛрдиреЛ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рджрд┐рдП рд╣реЛрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХрдИ рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб (рдпрд╛рдиреА рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЛрдб) рд╣реИрдВ?

@SherifRefaat рд╕рдВрднрд╡рддрдГ, рд▓реЛрдб рдХреА рдЧрдИ рдЕрд╕реЗрдВрдмрд▓реА рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрднрд╡ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЧреИрд░ рдирд┐рдпрддрд╛рддреНрдордХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдЧрд▓рддреА рд╣реИред

рдЬрдм рдЖрдк ConfigureServices рдореЗрдВ typeof(IRepository) рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ JITed рд╡рд┐рдзрд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

d0apga picture d0apga  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

davidfowl picture davidfowl  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

davidfowl picture davidfowl  ┬╖  27рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

seesharper picture seesharper  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

GrabYourPitchforks picture GrabYourPitchforks  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ