我们希望能够使用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”但它们已经关闭会更容易。
我们走错了路吗? 是否有更简单的方法以通用方式执行此操作?
非常感谢你 菲尔
答案 0 :(得分:0)
由于它是一个开源项目,您可以通过复制和粘贴DefaultComponentActivator代码来编写自己的组件激活器,更改您需要的内容并注册激活器。我已经使用Castle堆栈的其他几个组件完成了几次。完成后,发送补丁。