TypedFactoryFacility の使用時に ITcpServer の解決に問題があります。Windsor は、インターフェイス用に工場から返される適切なコンポーネントを見つけられないようです。私の場合に固有のものは、インターフェイス ITcpServer が非ジェネリックであり、それを実装するクラスが両方ともジェネリックであることです。
実行時に次のコードがスローされます。
未処理の例外: Castle.MicroKernel.ComponentNotFoundException: サービス ConsoleApplication1.StandardTcpServer`1 をサポートするためのコンポーネントが Castle.Facilities の Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve (タイプ サービス、IDictionary 引数、IReleasePolicy ポリシー) で見つかりませんでした.TypedFactory.TypedFactoryComponentResolver.Resolve(IKernelInternal カーネル、IReleasePolicy スコープ) Castle.Facility.TypedFactory.Internal.TypedFactoryInterceptor.Resolve(IInvocation 呼び出し) で Castle.Facility.TypedFactory.Internal.TypedFactoryInterceptor.Intercept(IInvocation 呼び出し) で Castle.DynamicProxy。 AbstractInvocation.Proceed()
at Castle.Proxies.ITcpServerFactoryProxy.Create[T](String serverType, T something)
コード:
class Program
{
static void Main(string[] args)
{
IWindsorContainer container = new WindsorContainer();
container.Install(new MyWindsorInstaller());
var f = container.Resolve<ITcpServerFactory>();
var tcpServer = f.Create("standard", "something");
tcpServer.Start();
}
}
public class MyWindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility<TypedFactoryFacility>();
container.Register(
Component.For<ITcpServer>().ImplementedBy(typeof(LibUvTcpServer<>)),
Component.For<ITcpServer>().ImplementedBy(typeof(StandardTcpServer<>)),
Component.For<ITcpServerFactory>().AsFactory(c => c.SelectedWith(new TcpServerComponentSelector()))
);
}
}
public class TcpServerComponentSelector : DefaultTypedFactoryComponentSelector
{
protected override Type GetComponentType(System.Reflection.MethodInfo method, object[] arguments)
{
var serverType = (string)arguments.First();
return serverType == "standard" ? typeof (StandardTcpServer<>) : typeof(LibUvTcpServer<>);
}
}
public interface ITcpServerFactory
{
ITcpServer Create<T>(string serverType, T something);
}
public class StandardTcpServer<T> : ITcpServer
{
public void Start()
{
Console.WriteLine("Started...");
}
}
public class LibUvTcpServer<T> : ITcpServer
{
private readonly T something;
public LibUvTcpServer(T something)
{
this.something = something;
}
public void Start()
{
Console.WriteLine("Started...");
}
}
public interface ITcpServer
{
void Start();
}
問題を解決するための助けをいただければ幸いです。