在.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的机制是什么?
答案 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>();