2012-08-27 17 views
5

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ı?

+1

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? –

+1

@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

+0

Başka bir yol olduğunu düşünmüyorum ya da bu işi yapabilecekseniz. Bu harici projeyi dışarda tutmak daha iyi olabilir. –

cevap

4

Autofac, registration sources destek kayıtlarını destekler (ve daha fazlası kayıt kaynaklarında here). Bir kayıt kaynağı, bir tür çözümlemeye çalışırken kabın danışacağı bir hizmettir. Kaynak, türü oluşturmak için bir yöntemle veya kaynağın istenen türü sağlayamadığını belirten boş bir liste ile yanıt verebilir. Sizin durumunuzda, istenen tipi Ninject kabınızdan çözümlemeye çalışacak bir kayıt kaynağı uygulanabilir.

Orchard'a fazla aşina değilim ama Autofac'i yapılandırmak için yapılandırma dosyalarını kullandığını tahmin ediyorum. Benim önerim, kayıt kaynak uygulamanızı kaydeden ve Orchard'ı load the module from config olarak yapılandırdığınız a simple Autofac module'u oluşturmanızdır.

+0

Tamam, iyi cevap. Bazı takipler .. Kayıt kaynağının dış projeye bağlı olan hizmeti, 'IUserServices' tanımlaması ve bunu çözmek için Ninject kapsayıcısına (çekirdek) talimat vermesi ve Autofac'e istenen türleri çözmemesini söyleyen boş bir numara döndürmesi istenirse veya Bu yanlış bir yaklaşım mı? – Mattias

+0

Benim fikrim şu ki, servisler için ilk isteği yapan Autofac olacağı için, kaynak "IUserServices" (ve bu konudaki diğer her hizmet) destekliyorsa "sorulur". O zaman bu hizmeti Ninject'den çözmeye çalışmalı. Ninject hizmeti içeriyorsa, örneği kaynağından döndürebilirsiniz. Değilse, kaynak boş döner. –

İlgili konular