首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Castle.MicroKernel.ComponentNotFoundException与TypedFactoryFacility

Castle.MicroKernel.ComponentNotFoundException与TypedFactoryFacility
EN

Stack Overflow用户
提问于 2013-01-04 11:30:48
回答 1查看 4.7K关注 0票数 2

在使用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

守则:

代码语言:javascript
复制
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();
}

如果能帮助解决这个问题,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 14:49:12

更改以下内容:

代码语言:javascript
复制
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());
    }
}

以及登记:

代码语言:javascript
复制
Component.For<ITcpServer>().Forward(typeof(LibUvTcpServer<>)).ImplementedBy(typeof(LibUvTcpServer<>)),
Component.For<ITcpServer>().Forward(typeof(StandardTcpServer<>)).ImplementedBy(typeof(StandardTcpServer<>)),

或者,如果您只需要通过工厂解决:

代码语言:javascript
复制
Component.For(typeof(LibUvTcpServer<>)),
Component.For(typeof(StandardTcpServer<>)),

祝好运,

Marwijn

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14156323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档