2013-05-22 2 views
2

Использование SimpleInjector Я вызываю container.Verify() в конце моей конфигурации и получаю диагностическую информацию в отладчике, как описано в the documentation. Я хотел бы записать эту информацию в файл журнала. Есть ли доступ к нему программным способом или способ привязать регистратор или трассировщик к SimpleInjector?Могу ли я написать результаты диагностики SimpleInjectors в файл журнала?

+0

Почему вы хотите сделать это? Запись в файл журнала кажется полезной, когда вам нужно проанализировать, что происходит в производственной среде, но разница между конфигурацией DI в вашем блоке разработчика и производственным сервером вряд ли будет разной, и поэтому результаты диагностики будут одинаковыми как на вашем компьютере, так и на сервере. – Steven

+0

В настоящее время мы работаем над открытием диагностического API. Вероятно, это будет добавлено в следующем выпуске (v2.4). – Steven

+0

Звучит хорошо :-) –

ответ

2

Простой инжектор 2.4 содержит diagnostic API (SimpleInjector.Diagnostics.dll), который позволяет запросить контейнер для диагностических предупреждений. С помощью этого API вы можете писать интеграционные тесты, которые автоматически проверяют конфигурацию для диагностических сообщений:

// using SimpleInjector.Diagnostics; 

[TestMethod] 
public void Container_Always_ContainsNoDiagnosticWarnings() 
{ 
    // Arrange 
    var container = Bootstrapper.GetInitializedContainer(); 

    container.Verify(); 

    // Assert 
    var results = Analyzer.Analyze(container); 

    Assert.IsFalse(results.Any(), Environment.NewLine + 
     string.Join(Environment.NewLine, 
      from result in results 
      select result.Description)); 
} 

Конечно, вы также можете написать это в файл:

var results = Analyzer.Analyze(container); 

File.WriteAllLines("c:\\diagnostic.txt", results.Select(r => r.Description)); 
+1

Спасибо, это похоже на то, что мне нужно. Кстати, если вы заинтересованы в том, чтобы это разоблачало, не прибегая к размышлениям, я мог бы нанести ему удар и отправить вам PR. –

+0

Спасибо за предложение, но эта часть системы является внутренней по причине. Я не хочу публиковать вещи, если я не уверен, что API прав. Например, эта функция, вероятно, получит свою собственную сборку в будущем и немного изменится. Вот почему он не открыт прямо сейчас. Прошу прощения, если это неудобно для вас. – Steven

+0

Нет проблем. Я могу это оценить. –

2

ContainerDebugView, который, как я полагаю, можно классифицировать как класс Facade для механизма диагностики в SimpleInjector, который используется только как DebuggerTypeProxy для класса Container.

Это внутренний класс с открытым конструктором, поэтому вы не можете его построить без использования отражения и класса Activator. Если вы это сделаете, вы должны иметь возможность вызвать конструктор с вашим контейнером, а затем использовать свойство Items для получения массива DebuggerViewItem, который содержит предупреждения и ошибки в вашей конфигурации.

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

Смежные вопросы