扩展Castle windsor以支持每个服务的私有构造函数的最简单方法是什么

时间:2010-03-12 16:07:36

标签: .net castle-windsor

我们希望能够使用Castle解决使用私有构造函数实现的服务。

这是一个虚构的“用例”:

public class SingletonClass : ISingletonClass
{

   private SingletonClass() {...} // Class users cannot create an instance

   public ISingletonClass Instance 
   { 
      get 
      {
         // The intention here is to get an instance of this service
         // it has previously been configured as singleton in the container
         return Container.Resolve<ISingletonClass>();
      }
   } 
}

我们希望可以选择将这些私有构造函数用于每个服务,而不仅仅是针对少数特定情况。因此,我们正在寻找一种简单而通用的解决方案。

我们使用自定义组件激活器寻找解决方案,但发现我们必须覆盖默认组件激活器的一个不那么重要的部分,例如CreateInstance方法。

这是默认组件激活器中的代码:

    protected virtual object CreateInstance(CreationContext context, object[] arguments, Type[] signature)
    {
        object instance = null;
        Exception exception;
        Type implementation = base.Model.Implementation;
        bool flag = base.Kernel.ProxyFactory.ShouldCreateProxy(base.Model);
        bool flag2 = true;
        if (!(flag || !base.Model.Implementation.IsAbstract))
        {
            throw new ComponentRegistrationException(string.Format("Type {0} is abstract.{2} As such, it is not possible to instansiate it as implementation of {1} service", base.Model.Implementation.FullName, base.Model.Service.FullName, Environment.NewLine));
        }
        if (flag)
        {
            flag2 = base.Kernel.ProxyFactory.RequiresTargetInstance(base.Kernel, base.Model);
        }
        if (flag2)
        {
            try
            {
                if (this.useFastCreateInstance)
                {
                    instance = FastCreateInstance(implementation, arguments, signature);
                }
                else
                {
                    instance = ActivatorCreateInstance(implementation, arguments);
                }
            }
            catch (Exception exception1)
            {
                exception = exception1;
                throw new ComponentActivatorException("ComponentActivator: could not instantiate " + base.Model.Implementation.FullName, exception);
            }
        }
        if (flag)
        {
            try
            {
                instance = base.Kernel.ProxyFactory.Create(base.Kernel, instance, base.Model, context, arguments);
            }
            catch (Exception exception2)
            {
                exception = exception2;
                throw new ComponentActivatorException("ComponentActivator: could not proxy " + base.Model.Implementation.FullName, exception);
            }
        }
        return instance;
    }

如果我们只能覆盖“ActivatorCreateInstance”或“FastCreateInstance”但它们已经关闭会更容易。

我们走错了路吗? 是否有更简单的方法以通用方式执行此操作?

非常感谢你 菲尔

1 个答案:

答案 0 :(得分:0)

由于它是一个开源项目,您可以通过复制和粘贴DefaultComponentActivator代码来编写自己的组件激活器,更改您需要的内容并注册激活器。我已经使用Castle堆栈的其他几个组件完成了几次。完成后,发送补丁。