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