Внедрение зависимостей и Log4Net - PullRequest
0 голосов
/ 09 июля 2020

Мне нужно добавить два разных метода журнала в мое приложение.

Теперь, чтобы добавить обычный журнал 4net в DI, мы можем сделать это (microsoft unity):

container.AddNewExtension<Log4NetExtension>();

Это с помощью Log4NetExtension.cs. Теперь, когда мне нужно добавить новое, добавьте

container.AddNewExtension<NewLog4NetExtension>();

Итак, я попытался переопределить «Log4NetExtension»

public interface ILogExtender : ILog 
{

}

[SecuritySafeCritical]
public class NewLog4NetExtension: UnityContainerExtension
{
    protected override void Initialize()
    {
        Context.Policies.Set(typeof(ILogExtender), typeof(ResolveDelegateFactory), (ResolveDelegateFactory)GetResolver);
    }

    public  ResolveDelegate<BuilderContext> GetResolver(ref BuilderContext context)
    {
        return (ref BuilderContext c) => LogManager.GetLogger("AuthenticationLog");
    }
}

А затем добавить это в контейнер DI: // оригинал container.AddNewExtension (); // новый контейнер регистратора .AddNewExtension ();

Но тогда ... я получаю следующее:

Объект типа 'log 4net .Core.LogImpl' не может быть преобразован в тип ' Accredit.Commons.Log 4Net .ILogExtender '. Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека, чтобы получить дополнительную информацию об ошибке и ее происхождении в коде.

Что я делаю не так? Любая помощь?

1 Ответ

0 голосов
/ 10 июля 2020

В итоге я делаю следующее:

public interface ILogExtender 
{
    ILog Log { get; set; }
}

// реализация интерфейса:

public class LogExtender : ILogExtender
{
    public ILog Log { get; set; }
}
   [SecuritySafeCritical]
    public class SomeExtensionLog4NetExtension : UnityContainerExtension
    {
        protected override void Initialize()
        {
            Context.Policies.Set(typeof(ILogExtender), typeof(ResolveDelegateFactory), (ResolveDelegateFactory)GetResolver);
        }

        public ResolveDelegate<BuilderContext> GetResolver(ref BuilderContext context)
        {
            return (ref BuilderContext c) => new LogExtender() { Log = LogManager.GetLogger("AuthenticationLog") };
        }
    }

Обратите внимание на необходимость реализации нового интерфейса и установки ILog из Logmanager к нему. Это немного грязно, но работает.

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

...