MVVMCross динамически создает generi c IMvxLog <T>для внедрения зависимостей - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь заставить Mvx работать так же, как работает Microsoft Logging, например, ILogger<T> через инъекцию, но застревает.

Я расширил интерфейс:

public interface IMvxLog<T> : IMvxLog {

}

В моем LoginViewModel я хочу ввести это:

public LoginViewModel(IMvxLog<LoginViewModel> loggger) { }

И затем я решил, что могу динамически построить, используя приведенное ниже в App.cs:

var logProvider = Mvx.IoCProvider.Resolve<IMvxLogProvider>();
Mvx.IoCProvider.LazyConstructAndRegisterSingleton(typeof(IMvxLog<>), () => logProvider.GetLogFor<>());

Это не работать, поскольку у меня нет аргумента типа для передачи в делегацию.

Using the generic method group 'GetLogFor' requires 1 type arguments

Как это можно сделать?

1 Ответ

2 голосов
/ 17 августа 2020

То, что вы там делаете, запрещено, Mvx может регистрировать такие инъекции с помощью открытых дженериков typeof(IFoo<>).

Вы можете делать все, что хотите, просто обернув поставщика GetLogFor в реализации MvxLog<T> и вызывает те же методы внутри:

public interface IMvxLog<T> : IMvxLog
{
}

public class MvxLog<T> : IMvxLog<T>
{
    private readonly IMvxLog _logImplementation;

    public MvxLog(IMvxLogProvider provider)
    {
        _logImplementation = provider.GetLogFor<T>();
    }

    public bool IsLogLevelEnabled(MvxLogLevel logLevel)
    {
        return _logImplementation.IsLogLevelEnabled(logLevel);
    }

    public bool Log(MvxLogLevel logLevel, Func<string> messageFunc, Exception exception = null, params object[] formatParameters)
    {
        return _logImplementation.Log(logLevel, messageFunc, exception, formatParameters);
    }
}

, а затем вы просто регистрируете его:

Mvx.IoCProvider.RegisterType(typeof(IMvxLog<>), typeof(MvxLog<>));

и используете его как:

public LoginViewModel(IMvxLog<LoginViewModel> loggger) 
{ 
    _logger = logger;    
}

HIH

...