5

E 'possibile registrare le dipendenze manualmente:convenzione basata in ASP.NET 5/6 MVC

services.AddTransient<IEmailService, EmailService>(); 
services.AddTransient<ISmsService, SmsService>(); 

Quando ci sono troppe dipendenze, diventa difficile per registrare tutte le dipendenze manualmente.

Qual è il modo migliore per implementare un bind basato su convenzione in MVC 6 (beta 7)?

P.S. Nei progetti precedenti ho utilizzato Ninject con ninject.extensions.conventions. Ma non riesco a trovare un adattatore Ninject per MVC 6.

+1

Autofac, che ha la scansione complesso, ha il supporto per MVC6 out; Funziona bene. –

risposta

0

Se è comunque interessante per qualcuno. Questa è la mia soluzione del problema con Autofac. Sono richiesti pacchetti Autofac e Autofac.Extensions.DependencyInjection NuGet.

// At Startup: 

using Autofac; 
using Autofac.Extensions.DependencyInjection; 

// ... 

public IServiceProvider ConfigureServices(IServiceCollection services) 
{ 
    // Some middleware 
    services.AddMvc(); 

    // Not-conventional "manual" bindings 
    services.AddSingleton<IMySpecificService, SuperService>(); 

    var containerBuilder = new ContainerBuilder(); 
    containerBuilder.RegisterModule(new MyConventionModule()); 
    containerBuilder.Populate(services); 
    var autofacContainer = containerBuilder.Build(); 

    return autofacContainer.Resolve<IServiceProvider>(); 
} 

Questo è il modulo convenzione:

using Autofac; 
using System.Reflection; 
using Module = Autofac.Module; 

// ... 

public class MyConventionModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     var assemblies = new [] 
     { 
      typeof(MyConventionModule).GetTypeInfo().Assembly, 
      typeof(ISomeAssemblyMarker).GetTypeInfo().Assembly, 
      typeof(ISomeOtherAssemblyMarker).GetTypeInfo().Assembly 
     }; 

     builder.RegisterAssemblyTypes(assemblies) 
      .AsImplementedInterfaces() 
      .InstancePerLifetimeScope(); 
    } 
} 
8

No, non è disponibile il supporto per la registrazione batch nella libreria DI di ASP.NET 5 incorporata. In effetti, ci sono many features that are needed to build large SOLID applications, but are not included nella libreria DI integrata.

La libreria di librerie ASP.NET inclusa è pensata principalmente per estendere il sistema ASP.NET stesso. Per la tua applicazione, ti consigliamo di utilizzare una delle librerie DI mature esistenti e la versione keep your configuration separate dalla configurazione utilizzata per configurare il sistema ASP.NET stesso. Ciò elimina la necessità di un adattatore.

2

Un adattatore MVC 6 esiste, ma visto che ASP.net 5 è ancora in Release candidate, non è ancora disponibile su NuGet quindi sarà necessario aggiungere il feed di ramo "master" di ASP.NET 5 da MyGet alle origini del pacchetto NuGet di Visual Studio.

Una guida per fare questo è disponibile qui:

http://www.martinsteel.co.uk/blog/2015/using-ninject-with-mvc6/