MvvmCross 中如何解析接口

How Interface is resolved in MvvmCross

在 .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 文档中我读到它被称为 Construction Injection

好的,我理解这部分,但有一件事对我来说是黑暗的: ILogger 实现存在于何处? 我没有在整个解决方案中找到任何类似

的部分
Mvx.RegisterType<ILogger , SomeLogger>();

怎么可能? ILogger是用什么机制注册的?

试试这个,如果 ILogger 在 MvvmCross 中有一个实现,您将填充该对象。 var logger = Mvx.Resolve<ILogger>();

我找到了答案。

我在 Setup.cs 中进入了 AndroidLogService:

    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 项目。