我在使用 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 方法需要定义构造函数?
任何想法如何解决这个问题?(删除单例不是一种选择)