Orchard CMS kullanarak bir web sitesi oluşturuyorum ve Orchard CMS içinde bir modülle birlikte kullanmak istediğim bağımlılık enjeksiyonu için Ninject ile yazılmış bir dış .NET projesi var. Orchard'ın bağımlılık enjeksiyonu için Autofac kullandığını biliyorum ve bu daha önce DI ile hiç çalışmamamdan dolayı bana sorun yaratıyor.Ninject .NET projemi Orchard CMS içinde kullanabilir miyim?
Ben böyle kaynağını,UserRegistrationSource
, kaydeden Autofac modülü,
UserModule
oluşturduk
:
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 yapıcı
public EFMembershipManager(ServerRepository db,
ServerRepositoryMembershipProvider membershipProvider,
string testUsername,
string serverUsername)
{
...
}
EFMembershipManager
DI en için Ninject kullanır ve ServerRepository
ve ayrıca Ninject kullanılarak enjekte edilir ServerRepositoryMembershipProvider
kullanan harici projesinden bir sınıftır.
Ve şimdi takıldım ...
Olmalı UserRegistrationSource
bir yapıcı argüman olarak Ninject kabı (çekirdek) alıp Ninject çekirdeğe giderir IUserServices
hizmeti bulmak ve sonra arabuluculuk yapmaya çalıştığını ve boş dönmek Autofac, IUserServices
ile ilgili herhangi bir şeyi çözmeyi denemese de bu yanlış bir yaklaşım mı?
Yeniden yazmanın neden gerekeceğini açıklayabilir misiniz? Bana sadece enjeksiyonla ilgili küçük bir kodun değiştirilmesi gerektiği gibi görünüyor. Sorunlardan bahsediyorsun. Bunlar özellikle nedir? –
@BertrandLeRoy Yeniden yazım, dış projenin bağımlılık enjeksiyonu için Ninject'i de kullanan diğer projelere çok fazla bağımlılık enjeksiyonu ve referansı olduğu gerçeğinden kaynaklanmaktadır. Yani her şeyin işe yaraması için birçok değişiklik olacak. Karşılaştığım problem, tüm Ninject enjeksiyonları Autofac enjeksiyonlarına dönüştürmek zorunda kalmadan Orchard modülümdeki harici projeye nasıl başvurabildiğim. Eğer bu mümkün olsa bile. – Mattias
Başka bir yol olduğunu düşünmüyorum ya da bu işi yapabilecekseniz. Bu harici projeyi dışarda tutmak daha iyi olabilir. –