如何在设计时使用单个多个组件

时间:2011-10-06 11:08:03

标签: silverlight singleton design-time

我有3个集会:

  • MyApp.Views(使用MyApp.Data和MyApp.Metadata)
  • MyApp.Data(使用MyApp.Metadata)
  • MyApp.Metadata

我有一个界面,比如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; }
}

不知何故,看起来单独的程序集被加载到单独的应用程序域(或类似的东西)。有人知道解决方案吗?

2 个答案:

答案 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; } }
}

无论如何,问题解决了:)