一般来说,好的设计建议使助手\操纵器\操作类无状态。在这里,您显然有一个有状态的辅助类,因为您可以通过属性_variableHandler
(不是真实属性,它更像是一个字段)设置对象的状态。
您可以做的是IVariableHandler
在 IoC 中注册工厂并将其注入XAMLHelper
. 然后在调用 helper 时,您只需指定要使用的处理程序并使用工厂重新创建它。使用某种缓存重用已经创建的对象,工厂可能会更聪明一些。
public intefrace IVariableHandlerFactory
{
IVariableHandler Get(string description);
}
public class VariableHandlerFactory : IVariableHandlerFactory
{
private readonly IDictionary<string, IVariableHandler> _cache;
public VariableHandlerFactory()
{
_cache = new Dictionary<string, IVariableHandler>();
}
public IVariableHandler Get(string description)
{
IVariableHandler handler;
if(_cache.TryGetValue(description, out handler))
{
return handler;
}
handler = //create it...
_cache[description] = handler;
return handler;
}
}
然后在里面使用它XAMLHelper
public class XAMLHelper
{
private readonly IVariableHandlerFactory _factory;
public XAMLHelper(IVariableHandlerFactory factory)
{
_factory = factory;
}
public void HelpMe(string description)
{
var handler = _factory.Get(description);
//do actual work using handler
}
}
让我们把它放在一边,在这里讨论真正的问题。首先,您缺少属性的注释:
[Dependency]
public IVariableTypeHandler VariableHandler { get; set; }
然后你可以注册XAMLHelper
使用InjectionProperty
container.RegisterType<VariableTypeHandlerImpl, IVariableTypeHandler>();
using(var lifetime = new ContainerControlledLifetimeManager())
container.RegisterType<XAMLHelper>(lifetime, new InjectionProperty("VariableHandler");
或者,如果你有IVariableTypeHandler
你可以使用的具体实例:
var variableHandler = VariableHandlerFactory.GetInstance("Str");
using(var lifetime = new ContainerControlledLifetimeManager())
container.RegisterType<XAMLHelper>(lifetime, new InjectionProperty("VariableHandler", variableHandler);