0

我的同事在我们的项目中设置了一个 Windsor TypedFactoryFacility。

我是 Windsor 的新手,不明白它是如何实现我们注册为工厂的 IServiceFactory 接口中的方法的。当我看到一个接受类型参数 T 并返回 T 的 Create 方法时,我认为它可能在后台调用了容器的 Resolve 方法。

我需要一个以 Type 作为参数并返回一个对象的 Create 重载。由于容器的 Resolve 方法具有这两种风格:

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

我认为添加 Create 的重载会起作用。相反,它似乎试图解析 System.Object 而不是我传入的类型。

有没有办法让 Windsor 以我想要的方式实现我的 Create 方法?我已经用反射器戳了一下,但无法弄清楚。

这是注册:

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);
}
4

1 回答 1

0

你想调用类似的东西serviceFactory.Create(typeof(IMyServce))而不是serviceFactory.Create<IMyService>()

尝试在扩展方法中使用反射,像这样

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

编辑:

这种扩展方法确实适用于温莎城堡创建的工厂。

这是我的原始测试代码,您可以将其放入 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
    {
    }
}
于 2012-02-23T10:30:48.283 回答