Как использовать синглтон для нескольких сборок во время разработки - PullRequest
1 голос
/ 06 октября 2011

У меня есть 3 сборки:

  • MyApp.Views (использует MyApp.Data и MyApp.Metadata)
  • MyApp.Data (использует MyApp.Metadata)
  • MyApp.Metadata

У меня есть интерфейс, скажем IMetadata.Затем у меня также есть реализация в MyApp.Metadata, которую я регистрирую в одноэлементном классе:

IoCContainer.Instance.Register<IMetadata, Metadata>();

Затем во время разработки я использую сборку, которая должна использовать метаданные (но это MyApp.Данные, которые разрешают тип):

IoCContainer.Instance.ResolveType<IMetadata>();

Но это не удается.IoCContainer.Instance не содержит те же интерфейсы (фактически, он пуст).Реализация синглтона действительно проста:

public class IoCContainer
{
    static IoCContainer()
    {
        Instance = new IoCContainer();
    }

    public static IoCContainer Instance { get; private set; }
}

Почему-то похоже, что отдельные сборки загружаются в отдельные домены приложений (или что-то в этом роде).Кто-нибудь знает решение для этого?

Ответы [ 2 ]

0 голосов
/ 06 октября 2011

Хорошо, проблема кажется решаемой. Это может иметь 2 причины:

Во-первых, иногда 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; } }
}

В любом случае, проблема решена:)

0 голосов
/ 06 октября 2011

Может быть проблема с многопоточностью. Ваш экземпляр синглтона может быть создан дважды разными потоками. Взгляните на http://www.yoda.arachsys.com/csharp/singleton.html. Это объясняет это более подробно и предоставляет вам решение для многопоточного программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...