我遇到以下问题与Unity框架。统一BuildUp失败的单身人士
我们在我们的项目中有一个singleton类。他们有一些属性应该由Unity容器注入。下面是代码:
private static SomeClass m_Instance;
private SomeClass()
{ }
public static SomeClass Instance
{
get
{
if (m_Instance == null)
{
lock (typeof(SomeClass))
{
if (m_Instance == null)
{
IUnityContainer container = ContainerAccessor.GetContainer();
m_Instance = container.BuildUp<SomeClass>(new SomeClass());
}
}
}
return m_Instance;
}
}
此代码失败,出现以下异常:类型SomeClass的无法构造。您必须配置容器以提供此值。
我已经挖成统一的代码并发现问题是由方法PreBuildUp,它调用GuardTypeIsNonPrimitive,无论是在Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy类中定义引起的。这是它的代码片段:
public override void PreBuildUp(IBuilderContext context)
{
...
SelectedConstructor selectedConstructor = context.Policies.Get<IConstructorSelectorPolicy>(context.BuildKey, out list).SelectConstructor(context, list);
GuardTypeIsNonPrimitive(context, selectedConstructor);
...
}
private static void GuardTypeIsNonPrimitive(IBuilderContext context, SelectedConstructor selectedConstructor)
{
Type type = context.BuildKey.Type;
if (!type.IsInterface && ((type == typeof(string)) || (selectedConstructor == null)))
{
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.TypeIsNotConstructable, new object[] { type.Name }));
}
}
正如我们所看到的,Unity试图找到应构建的类的构造函数。由于为SomeClass定义的唯一构造函数是私有的,因此Unity找不到任何内容,并将null传递给GuardTypeIsNonPrimitive。而这种方法会引发异常。目前我已经定义了SomeClass的公共构造函数(只是为了证明这个概念),一切都很好。
问题:
UPDATE:为什么要定义方法需要构造的积累?
任何想法如何解决这个问题? (删除单是不是一种选择)
+1是的,使用容器来保存你的单身人士。这是你拥有容器的原因之一。 – PVitt 2011-05-13 11:03:00
如果我错了,请纠正我,但您的建议似乎认为SomeClass已在容器中注册。但它不是,也不会是,这就是我们在这里试图使用BuildUp方法的原因。 – Andrei 2011-05-13 11:04:21
然后你必须提供一个容器的构造函数。 – PVitt 2011-05-13 11:09:45