2012-08-27 4 views
5

オーチャードCMSを使用してウェブサイトを作成しています。オーチャードCMS内のモジュールと一緒に使用する依存関係注入用のNinjectで書かれた外部.NETプロジェクトがあります。私はOrchardが依存性注入のためにAutofacを使用していることを知っています。オーチャードCMSでNinject .NETプロジェクトを使用できますか?

私はこのように、ソースレジスタAutofacモジュール、UserModuleUserRegistrationSourceを作成した:

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コンストラクタ

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

EFMembershipManagerはDIのためNinjectを使用してもNinjectを使用して注入されServerRepositoryServerRepositoryMembershipProviderを使用する外部プロジェクトからのクラスです。

そして今、私がこだわっている...

UserRegistrationSourceコンストラクタ引数としてNinjectコンテナ(カーネル)に乗り、IUserServicesサービスを見つけようとし、その後Ninjectカーネルに解決を仲介し、空を返す必要がありますオートファックがIUserServicesに関連する何かを解決しようとしないように列挙できる、またはこれは間違ったアプローチですか?

+1

なぜ書き換えが必要なのか説明できますか?私には、注射を扱っている小さなコードだけを修正する必要があるように思えます。あなたは問題に言及します。彼らは具体的に何ですか? –

+1

@BertrandLeRoy外部プロジェクトには多くの依存性注入と依存性注入にもNinjectを使用する他のプロジェクトへの参照があるという事実から書き直しています。したがって、すべてを機能させるためには多くの変更が行われます。私が直面している問題は、すべてのNinject注射をAutofac注射に変換することなく、Orchardモジュールで外部プロジェクトを参照する方法です。それが可能であれば。 – Mattias

+0

私は別の方法があるとは思わないか、この仕事をすることができるでしょうか。その外部プロジェクトを外部に保つ方が良いかもしれません。 –

答えて

4

オートファックサポートregistration sources(以上、登録ソースhere)。登録ソースは、型を解決する際にコンテナが参照するサービスです。ソースは、型を構築する手段で応答することも、ソースが要求された型を提供できないことを示す空のリストで応答することもできます。

あなたのケースでは、Ninjectコンテナから要求された型を解決しようとする登録ソースを実装することができます。

私はオーチャードにはそれほど精通していませんが、設定ファイルを使ってオートファックを設定していると思います。あなたの登録ソースの実装を登録するa simple Autofac moduleを作成し、Orchardをload the module from configに設定することをお勧めします。

+0

さて、良い答えです。いくつかのフォローアップ..登録ソースが外部プロジェクト「IUserServices」に接続されているサービスを識別し、Ninjectコンテナ(カーネル)にそれを解決するように指示し、要求されたタイプを解決しないようにAutofacに指示する空の列挙型を返すか、これは間違ったアプローチですか? – Mattias

+0

私が考えているのは、サービスの初期要求を行うAutofacであるため、ソースが 'IUserServices'(およびそれ以外のすべてのサービス)をサポートしているかどうかを尋ねられます。それから、そのサービスをNinjectから解決しようとするべきです。 Ninjectにサービスが含まれている場合は、ソースからインスタンスを返すことができます。そうでない場合、ソースは空に戻ります。 –

関連する問題