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?
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? –
@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
Non penso che ci sia un altro modo o se sarai in grado di farlo funzionare. Potrebbe essere meglio mantenere questo progetto esterno esterno. –