0

私の同僚は、プロジェクトでWindsor TypedFactoryFacilityを設定しました。TypedFactoryウィンザーはどのようなコントロールを実装していますか?

私はWindsorを初めて使い、ファクトリとして登録するIServiceFactoryインターフェイスのメソッドをどのように実装しているのか分かりません。型パラメータTをとりTを返すCreateメソッドを見たとき、おそらくコンテナのResolveメソッドを呼び出していると考えました。

パラメータとしてTypeをとり、オブジェクトを返すCreateのオーバーロードが必要です。コンテナの解決方法は、これらの味の両方を持っているので:

T Resolve<T>(string key); 
object Resolve(Type service); 

私は作成の過負荷を加えることは働くだろうと思いました。代わりに、タイプIの代わりにSystem.Objectを解決しようとしているようです。

ウィンザーを自分の作成メソッドを私が望むように実装する方法はありますか?私はリフレクターでちょっと突っ込んだが、それを理解することはできない。ここで

が登録され:

container.AddFacility<TypedFactoryFacility>(); 
     container.Register(
       Component.For<IServiceFactory>() 
         .AsFactory() 
         .LifeStyle.Transient); 

とインタフェース自体:

public interface IServiceFactory 
{ 
    //Original Create method that works 
    T Create<T>(); 

    //The overload that I need that throws an exception 
    object Create(Type service) 

    void Release(object service); 
} 

答えて

0

あなたの代わりにserviceFactory.Create<IMyService>()serviceFactory.Create(typeof(IMyServce))のようなものを呼びたいですか?

この拡張メソッドが実際に城ウィンザーで作成された工場では動作しない:

この

public static class ServiceFactoryExtensions 
{ 
    public static object Create(this IServiceFactory factory, Type serviceType) 
    { 
     return typeof(IServiceFactory).GetMethod("Create") 
      .MakeGenericMethod(serviceType).Invoke(factory, new object[]{}); 
    } 
} 

EDITのように、拡張メソッドでリフレクションを使用してみてください。

私のオリジナルのテストコードは、VS2010コンソールアプリケーションのProgram.csにドロップし、Castle.CoreとCastle.Windsorへの参照を追加して実行することができます。私はCastle.Windsor 2.5.4を使用しました。

using System; 
using Castle.Facilities.TypedFactory; 
using Castle.MicroKernel.Registration; 
using Castle.Windsor; 

namespace StackOverflow9198461 
{ 
    public static class ServiceFactoryExtensions 
    { 
     public static object Create(this IServiceFactory factory, Type serviceType) 
     { 
      return typeof(IServiceFactory).GetMethod("Create") 
       .MakeGenericMethod(serviceType) 
       .Invoke(factory, new object[] { }); 
     } 
    } 

    class Program 
    { 
     static void Main() 
     { 
      var container = new WindsorContainer(); 
      container.AddFacility<TypedFactoryFacility>(); 
      container.Register(Component 
       .For<IServiceFactory>() 
       .AsFactory()); 
      container.Register(Component 
       .For<IMyService>() 
       .ImplementedBy<MyService>() 
       .LifeStyle.Singleton); 
      var factory = container.Resolve<IServiceFactory>(); 
      var s1 = factory.Create<IMyService>(); 
      var s2 = factory.Create(typeof(IMyService)); 
      Console.WriteLine(s1.GetType().FullName); 
      Console.WriteLine(s2.GetType().FullName); 
      if (s1 == s2) Console.WriteLine("Success"); 
     } 
    } 

    public interface IServiceFactory 
    { 
     //Original Create method that works 
     T Create<T>(); 

     ////The overload that I need that throws an exception 
     //object Create(Type service) 

     void Release(object service); 
    } 

    public class MyService : IMyService 
    { 
    } 

    public interface IMyService 
    { 
    } 
} 
+0

IServiceFactoryは、インターフェイス(内部はCastle Windsorによって実装されています)ですので、拡張メソッドを使用しないでください。 – Stumblor

+0

@Stumblorあなたは間違っています。このような状況で拡張メソッドが機能しました。答えを書いたときの完全な作業コードの例を追加しました。 [拡張メソッドのMSDN](http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx)から: "拡張メソッドを使用して、クラスまたはインターフェイスを拡張できますが、それらをオーバーライドすることはできません。 "私の答えを読んでくれてありがとう。 –

関連する問題