Как я могу обеспечить создание экземпляра объекта-наблюдателя в сборке dll при запуске? - PullRequest
1 голос
/ 04 февраля 2012

Я создал класс (наблюдатель), который будет выполнять некоторые действия на основе определенных событий в других классах (издателях).Наблюдатель и издатели все в одной dll.

Я мог бы создать другой класс в сборке и потребовать, чтобы клиентские приложения вызывали что-то вроде BootStrapper.Configure () перед использованием других классов;однако я хотел бы избежать необходимости обновлять все клиентские приложения одновременно.

Я мог бы создать базовый класс для классов издателя и вызвать оттуда BootStrapper.Configure ();однако издатели в настоящее время наследуют разные базовые классы.Я хотел бы пока избегать рефакторинга этих классов.

Что я действительно хотел бы сделать, так это убедиться, что класс «наблюдатель» создается при запуске клиентского приложения или при первом запуске любой класс в dll ссылается.

Каков наилучший способ обеспечить создание экземпляра класса "наблюдатель" до того, как какое-либо "издательство" опубликует событие?1014 * Пример проекта: https://www.box.com/s/0ihvp11kd7bfb6mqlnmc Я бы хотел, чтобы любой метод в BootStapper.cs выполнялся при загрузке LogicLibrary.

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Обновлено в ответ на опубликованный проект

Текущий дизайн в предоставленном решении ограничивает издателя (ей) быть в сборке (так как загрузчик жестко кодирует подключение делегата)что только добавляет сложности без пользы.Если у вас есть издатели за пределами сборки, в которой находится наблюдатель, ваш текущий шаблон потребует загрузчика в каждой сборке, содержащей издателя.Это просто перемещение линий из одного места в менее очевидное место, и его будет сложнее поддерживать.

Я бы порекомендовал взглянуть на интерфейс IObserver и пример реализации, приведенный там: http://msdn.microsoft.com/en-us/library/dd783449.aspx

Предыдущий ответ:

Если вы просто используете классический синглтон в качестве своего наблюдателя и вам нужно сослаться на указанный синглтон, чтобы подключить ваши события, акт ссылки на синглтон обеспечитего создание.

Кажется ненужным указывать, что наблюдатель должен быть создан до того, как будет ссылаться на любой класс в DLL.Вам нужно только гарантировать, что наблюдатель создан до того, как какой-либо издатель поднимет его событие.

Лучшим решением будет использование контейнера IOC для создания одиночного экземпляра наблюдателя и автоматического подключения события длявсе издатели.

0 голосов
/ 04 февраля 2012

Есть несколько способов сделать это. Одним из методов может быть использование DllMain в DLL-оболочке C ++ / CLR, но я должен подумать об этом. Я бы с большей вероятностью вызвал какой-то метод создания экземпляров из статического конструктора каждого класса в DLL, чтобы полностью им управлять.

internal static class DllMain
{
    private volatile bool Initialized = false;

    public static void OnStaticConstructor()
    {
        if (!Initialized)
        {
            Initialized = true;
            Initialize();
        }
    }

    private void Initialize()
    {
        // Put whatever you need to run once here.
    }
}

public class A
{
    static A()
    {
        DllMain.OnStaticConstructor();
    }

    // ...
}

public class B
{
    static B()
    {
        DllMain.OnStaticConstructor();
    }

    // ...
}
...