2012-08-27 15 views
5

Sto creando un sito web utilizzando Orchard CMS e ho un progetto di .NET esterna scritto con Ninject per l'iniezione di dipendenza che vorrei utilizzare insieme ad un modulo all'interno di Orchard CMS. So che Orchard usa Autofac per l'iniezione delle dipendenze e questo mi sta causando problemi poiché non ho mai lavorato con DI prima.Posso utilizzare il mio progetto Ninject .NET in Orchard CMS?

ho creato un modulo Autofac, UserModule, che registra la fonte, UserRegistrationSource, così:

UserModule.cs

public class UserModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterSource(new UserRegistrationSource()); 
    } 
} 

UserRegistrationSource.cs

public class UserRegistrationSource : IRegistrationSource 
{ 
    public bool IsAdapterForIndividualComponents 
    { 
     get { return false; } 
    } 

    public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor) 
    { 
     var serviceWithType = service as IServiceWithType; 
     if (serviceWithType == null) 
      yield break; 

     var serviceType = serviceWithType.ServiceType; 
     if (!serviceType.IsInterface || !typeof(IUserServices).IsAssignableFrom(serviceType) || serviceType != typeof(IUserServices)) 
      yield break; 

     var registrationBuilder = // something... 

     yield return registrationBuilder.CreateRegistration(); 
    } 
} 

UserServices.cs

public interface IUserServices : IDependency 
{ 
    void Add(string email, string password); 
} 

public class UserServices : IUserServices 
{ 
    private readonly EFMembershipManager _manager; 

    public UserServices(EFMembershipManager manager) 
    { 
     _manager = manager; 
    } 

    public void Add(string email, string password) 
    { 
     _manager.createUser(email, password); 
    } 
} 

EFMembershipManager.cs costruttore

public EFMembershipManager(ServerRepository db, 
          ServerRepositoryMembershipProvider membershipProvider, 
          string testUsername, 
          string serverUsername) 
{ 
... 
} 

EFMembershipManager è una classe dal progetto esterno che utilizza Ninject per DI e di utilizza ServerRepository e ServerRepositoryMembershipProvider quale pure vengono iniettati usando Ninject.

E ora mi sono bloccato ...

Qualora UserRegistrationSource prendere il contenitore Ninject (kernel) come un argomento del costruttore e cercare di trovare il servizio IUserServices e quindi mediare gli risolve al kernel Ninject e restituire un vuoto Enumerabile in modo che Autofac non provi a risolvere qualsiasi cosa relativa a IUserServices o si tratta dell'approccio sbagliato?

+1

si può spiegare il motivo per cui avrebbe bisogno di una riscrittura? Mi sembra che solo il piccolo codice che ha a che fare con l'iniezione debba essere modificato. Lei parla di problemi. Cosa sono specificamente? –

+1

@BertrandLeRoy La riscrittura deriva dal fatto che il progetto esterno ha un sacco di iniezioni di dipendenza e riferimenti ad altri progetti che utilizza anche Ninject per l'iniezione di dipendenza. Quindi ci saranno molte modifiche per far funzionare tutto. Il problema che sto affrontando è semplicemente come posso fare riferimento al progetto esterno nel mio modulo Orchard senza dover convertire tutte le iniezioni di Ninject alle iniezioni di Autofac. Se è anche possibile. – Mattias

+0

Non penso che ci sia un altro modo o se sarai in grado di farlo funzionare. Potrebbe essere meglio mantenere questo progetto esterno esterno. –

risposta

4

Autofac supporta registration sources (e altro sulle origini di registrazione here). Una fonte di registrazione è un servizio che il contenitore consulta quando tenta di risolvere un tipo. La fonte può rispondere, sia con un mezzo per costruire il tipo, sia con una lista vuota che indica che la fonte non è in grado di fornire il tipo richiesto.

Nel tuo caso, una fonte di registrazione potrebbero essere attuate che cercherà di risolvere il tipo richiesto dal contenitore Ninject.

Io non sono troppo familiarità con Orchard, ma sto cercando di indovinare che utilizza i file di configurazione per configurare Autofac. Il mio suggerimento è di creare a simple Autofac module che registri l'implementazione dell'origine della registrazione e di configurare Orchard su load the module from config.

+0

Ok, buona risposta. Alcuni follow-up .. Se la fonte di registrazione identifica il servizio che è collegato al progetto esterno, 'IUserServices', istruisce il contenitore Ninject (kernel) per risolverlo e restituisce una enumerable vuota che dice ad Autofac di non risolvere i tipi richiesti o è questo l'approccio sbagliato? – Mattias

+0

La mia idea è che, poiché sarà Autofac a fare la richiesta iniziale di servizi, la fonte verrà "chiesta" se supporta "IUserServices" (e ogni altro servizio per quella materia). Dovrebbe quindi provare a risolvere quel servizio da Ninject. Se Ninject contiene il servizio è possibile restituire l'istanza dalla sorgente. In caso contrario, la fonte restituisce vuoto. –

Problemi correlati