Хорошо, поэтому я пытаюсь создать что-то вроде онлайн-консоли на портале администратора, чтобы я мог отслеживать ошибки и предупреждения в режиме реального времени, как это делает обычная консоль. Я использую SignalR с отдельным концентратором, к которому администратор может подключиться (авторизовано). У меня также есть Nlog в проекте, полностью работающем. Кроме того, мой концентратор администратора открыт вне концентратора, поэтому я могу отправлять сообщения из любого места в проекте после его внедрения (что-то похожее на Решение № 2 здесь ).
Я хочу использовать SignalR в качестве цели для Nlog. Проблема заключается в том, что Nlog CustomTargets
должен быть инициализирован с использованием конструкторов без параметров, что не могло помочь в моем случае, так как я должен передать контекст концентратора администратора в качестве зависимости.
Вот блок кода, помогающий визуализировать мою проблему:
[Target("HubNlogHelper")]
public sealed class HubNlogHelper : TargetWithLayout
{
[RequiredParameter]
public string Host { get; set; }
public HubNlogHelper()
{
Host = "localhost";
}
private readonly IAdminHub _adminHub; // THIS REMAINS NULL
public HubNlogHelper(IAdminHub adminHub) // THIS NEVER GETS CALLED
{
_adminHub = adminHub;
}
protected override void Write(LogEventInfo logEvent)
{
string logMessage = Layout.Render(logEvent);
_adminHub.doSomethingWithMsg(logMessage);
}
}
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
throwConfigExceptions="true"
internalinternalLogLevel="Warn">
<extensions>
<add assembly="MyProjectName"/>
</extensions>
<targets>
<target name="HubNlogHelper" type="HubNlogHelper" layout="${longdate} | ${message}"/>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="HubNlogHelper" />
</rules>
</nlog>
Что я упускаю? Заранее спасибо ..