我有3个集会:
我有一个界面,比如IMetadata。然后,我在MyApp.Metadata中有一个实现,我在单例类中注册:
IoCContainer.Instance.Register<IMetadata, Metadata>();
然后,在设计时,我使用需要使用元数据的程序集(但它是解析类型的MyApp.Data):
IoCContainer.Instance.ResolveType<IMetadata>();
但这失败了。 IoCContainer.Instance不包含相同的接口(实际上,它是空的)。单例实现非常基础:
public class IoCContainer
{
static IoCContainer()
{
Instance = new IoCContainer();
}
public static IoCContainer Instance { get; private set; }
}
不知何故,看起来单独的程序集被加载到单独的应用程序域(或类似的东西)。有人知道解决方案吗?
答案 0 :(得分:0)
可能是一个线程问题。您的单例实例可以由不同的线程实例化两次。看看http://www.yoda.arachsys.com/csharp/singleton.html。它更详细地解释了它,并为您提供了一个线程安全的解决方案。
答案 1 :(得分:0)
好的,问题似乎有待解决。它可能有两个原因:
首先,有时visual studio“更新”你对共享库的引用,所以一个指向bin \ debug \ mysharedassembly.dll,另一个仍然指向.... \ lib \ mysharedassembly。这是VS2010的某种愚蠢行为,它试图超越开发者。
其次,我有IoC容器的这个定义:
public class IoCContainer
{
static IoCContainer()
{
Instance = new IoCContainer();
}
private IoCContainer()
{
}
public static IoCContainer Instance { get; private set; }
}
我改为:
public class IoCContainer
{
private static readonly IoCContainer _instance = new IoCContainer;
private IoCContainer()
{
}
public static IoCContainer Instance { get { return _instance; } }
}
无论如何,问题解决了:)