在使用ITcpServer时,我在解决TypedFactoryFacility时遇到了一些问题。看起来温莎没有找到一个合适的组件从工厂返回接口。具体到我的情况,接口ITcpServer是非泛型的,而实现它的类都是泛型的。
以下代码在运行时抛出:
未处理的异常: Castle.MicroKernel.ComponentNotFoundException:没有支持服务ConsoleApplication1的组件。service `1位于Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type服务、IDictionary参数、IReleasePolicy策略( Castle.Facilities.TypedFactory.TypedFactoryComponentResolver.Resolve(IKernelInternal内核)、IReleasePolicy范围(在Castle.Facilities.TypedFactory.Internal.TypedFactoryInterceptor.Resolve(IInvocation调用)、(在Castle.Facilities.TypedFactory.Internal.TypedFactoryInterceptor.Intercept(IInvocation调用))( Castle.DynamicProxy.AbstractInvocation.Proceed() )。 在Castle.Proxies.ITcpServerFactoryProxy.CreateT
守则:
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();
}如果能帮助解决这个问题,我们将不胜感激。
发布于 2013-01-04 14:49:12
更改以下内容:
protected override Type GetComponentType(System.Reflection.MethodInfo method, object[] arguments)
{
var serverType = (string)arguments.First();
if (serverType == "standard")
{
return typeof(StandardTcpServer<>).MakeGenericType(arguments[1].GetType());
}
else
{
return typeof(LibUvTcpServer<>).MakeGenericType(arguments[1].GetType());
}
}以及登记:
Component.For<ITcpServer>().Forward(typeof(LibUvTcpServer<>)).ImplementedBy(typeof(LibUvTcpServer<>)),
Component.For<ITcpServer>().Forward(typeof(StandardTcpServer<>)).ImplementedBy(typeof(StandardTcpServer<>)),或者,如果您只需要通过工厂解决:
Component.For(typeof(LibUvTcpServer<>)),
Component.For(typeof(StandardTcpServer<>)),祝好运,
Marwijn
https://stackoverflow.com/questions/14156323
复制相似问题