【发布时间】:2011-05-13 10:52:35
【问题描述】:
我在使用 Unity 框架时遇到以下问题。
我们的项目中有一个单例类。它们有一些属性应该由 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。您必须配置容器以提供此值。
我深入研究了 Unity 代码,发现问题是由方法 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 定义了公共构造函数(只是为了证明这个概念),一切都很好。
问题:
更新:为什么 BuildUp 方法需要定义构造函数?
有什么办法可以解决这个问题吗? (删除单例不是一个选项)
【问题讨论】:
标签: singleton unity-container unity2.0