如何在MvvmCross中解析接口

时间:2018-09-18 15:25:52

标签: c# logging interface 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的机制是什么?

2 个答案:

答案 0 :(得分:1)

我找到了答案。

我进入了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名称= AndroidLogService。

在进行此检查之前,我认为由于.Core项目没有对.Droid项目的任何引用,因此,它们有不同的实现,但是我错了: 在.Droid / .iOs项目中实现的接口也适用于.Core项目。

答案 1 :(得分:0)

尝试此操作,如果ILogger在MvvmCross中具有实现,则将填充该对象。  var logger = Mvx.Resolve<ILogger>();