Статические идеи дизайна инициализации - PullRequest
0 голосов
/ 31 января 2012

В настоящее время мое приложение MVC 3 имеет зависимость от статического класса, который инициализируется в Application_Start () следующим образом:

protected void Application_Start()
{
    MyDependency.Initialize();
}

С статическим классом, более или менее похожим на следующее:

public static class MyDependency
{
    public static void Initialize()
    {
        // Perform some I/O...
    }
}

Эта зависимость используется в классе атрибутов, который сопровождается предупреждением об отсутствии зависимостей во время выполнения (отсюда и вызов инициализации в Application_Start ())

public class MyAttributeClass : ...
{
    public MyAttributeClass()
    {
        MyDependency.DoSomething(); //...
    }
}

Окончательнодругие разработчики в нашем магазине должны будут использовать этот API, и я хотел бы посмотреть, есть ли способ избавиться от строки в Application_Start () (дополнительная строка кода в Global.asax, вероятно, будетзабытый шаг)

Например, есть ли способ, которым класс MyDependency может "подключиться" к конвейеру без необходимости редактировать Global.asax?

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Используйте статический конструктор в MyDependency. Вот MSDN, объясняющий функциональность, которую предоставляют статические конструкторы.

Используя статический конструктор, вы сможете выполнять все необходимые операции ввода-вывода, так как конструктор будет запущен до того, как будут получены какие-либо статические элементы.

0 голосов
/ 31 января 2012

Вы должны посмотреть на WebActivator . Из вики :

WebActivator - это пакет NuGet, который позволяет другим пакетам легко введите код запуска и завершения работы в веб-приложение. Это дает гораздо более чистое решение, чем модифицировать global.asax с помощью логика запуска из многих пакетов.

По сути, вам понадобится что-то вроде:

using System;

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyDependency), "Initialize")]
public static class MyDependency
{
    public static void Initialize()
    {
        // Perform some I/O...
    }
}
...