Как интерфейс решается в MvvmCross - PullRequest
0 голосов
/ 18 сентября 2018

В проекте .Core У меня есть интерфейс для ведения журнала:

 public interface ILogger
{
    void Trace(string format, params object[] args);
    .........
    void Fatal(string format, params object[] args);
}

, который используется в интерфейсе службы журнала:

public interface ILogService
{
    ILogger GetLogger(string name);
    ILogger GetLogger(Type typeName);
    ILogger GetLogger<T>();
}

В проекте .Droid этот интерфейс реализован:

 public class AndroidLogService : ILogService
{
    public ILogger GetLogger(string name)
    {
        return new AndroidLogger(name);
    }

    public ILogger GetLogger(Type typeName)
    {
        return GetLogger(typeName.Name);
    }

    public ILogger GetLogger<T>()
    {
        return GetLogger(typeof(T));
    }
}

В файле .Droid Setup.cs AndroidLogService зарегистрирован:

 Mvx.LazyConstructAndRegisterSingleton<ILogService, AndroidLogService>();
 Mvx.LazyConstructAndRegisterSingleton<IFileService, AndroidFileService>();

и, наконец, используется в каком-то файле в проекте .Droid:

 private readonly ILogger _logger;

    public AndroidFileService(IContextService contextService, ILogService logService, IEncryptionService encryptionService)
    {
        _logger = logService.GetLogger<AndroidFileService>();
        .......
    }

Наконецжурналы работают так:

_logger.Warn("Failed to retrieve logo. Error: {0}", ex);

Мои сомнения и вопросы: AndroidFileService никогда не вызывается с параметрами, описанными выше, но из документов MvvmCross я читал, что он называется Конструкционный впрыск

Хорошо, я понимаю эту часть, но одна вещь для меня мрачна: где существует реализация ILogger?Я не нашел во всем решении какой-либо части с чем-то вроде

Mvx.RegisterType<ILogger , SomeLogger>();

Как это может быть?Какой механизм используется для регистрации ILogger?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Я нашел ответ.

Я зашел в AndroidLogService в Setup.cs:

    public class AndroidLogService : ILogService
{
    public ILogger GetLogger(string name)
    {
        return new AndroidLogger(name);
    }

    public ILogger GetLogger(Type typeName)
    {
        return GetLogger(typeName.Name);
    }

    public ILogger GetLogger<T>()
    {
        return GetLogger(typeof(T));
    }
}

Затем я зашел в AndroidLogger:

using NLog;
using ILogger = ....Services.Support.ILogger;//from .Core project
namespace ....Android.Services.Support//from .Droid project
{
public class AndroidLogger : ILogger
{
    private readonly NLog.ILogger _logger;

    public AndroidLogger(string name)
    {
        _logger = LogManager.GetLogger(name);
    }
    .................

, где я вижуиспользуется NLog, который является встроенной реализацией ILogger.

Итак, когда сборка была создана для Android, я вставил этот фрагмент в 2 файла: один из проекта .Core и другой из .Droid

_logger = logService.GetLogger<SomeViewModel>();
String name = logService.GetType().Name;
_logger.Debug("LogService name = {0} ", name);

, что привело к обоим случаям как LogService name = AndroidLogService.

До этой проверки я думал, что как проект .Core не имеет ссылки на проект .Droid, так что существуют разные реализации дляих, но я ошибся: интерфейс, реализованный в проекте .Droid / .iOs, также работает для проекта .Core.

0 голосов
/ 18 сентября 2018

Попробуйте, если ILogger имеет реализацию в MvvmCross, вы получите объект заполненный.var logger = Mvx.Resolve<ILogger>();

...