我决定尝试给Xarmarin,我想通过Android上下文。
我在今天与Android和Roboguice做了类似的想法。他们有一个提供者工厂,它允许你传递该项目以通过属性注入。
我想尝试使用IoC(理想情况下为Autofac)。我已经按照这个例子:http://arteksoftware.com/ioc-containers-with-xamarin/
我想补充一点,我发现服务很困难,我想通过构造函数注入实例。
你们都能做到吗?
答案 0 :(得分:0)
我决定尝试给Xarmarin,我想通过android上下文。
直接传递android 上下文?不,没有办法做到这一点。接口在PCL中定义,但PCL中没有适当的容器(类型)来接受上下文实例。
但您可以将自己的界面和类定义为利用Context实例:
基于您发布的博客演示的示例(利用上下文读取Assets文件夹中的txt
文件):
Assets
文件夹中添加txt文件(abc.txt),并将其BuildAction
设置为AndroidAssets
。在PCL中定义一个新接口:
public interface IContextUtility
{
string GetAssetTxt(string str);
}
在MainViewModel.cs
中添加IContextUtility变量:
public class MainViewModel
{
private readonly IPlatform _platform;
private readonly ISettings _settings;
private readonly IContextUtility _contextUtility;
public MainViewModel (IPlatform platform, ISettings settings,IContextUtility contextUtility)
{
_settings = settings;
_platform = platform;
_contextUtility = contextUtility;
}
public string Abc
{
get {
return _contextUtility.GetAssetTxt("abc.txt");
}
}
...
}
在Android项目中添加IContextUtility
实施:
public class MyContextUtility : IContextUtility
{
public string GetAssetTxt(string str)
{
string strToReturn = null;
using (var stream = Application.Context.Assets.Open(str))
{
using (StreamReader reader = new StreamReader(stream))
{
strToReturn=reader.ReadToEnd();
}
}
return strToReturn;
}
}
在App.cs
注册新实例:
[Application(Icon="@drawable/icon", Label="@string/app_name")]
public class App : Application
{
public static IContainer Container { get; set; }
public App(IntPtr h, JniHandleOwnership jho) : base(h, jho)
{
}
public override void OnCreate()
{
var builder = new ContainerBuilder();
builder.RegisterInstance(new MyContextUtility()).As<IContextUtility>();
...
}
}
现在,您可以在MainActivity中使用它:
var text = viewModel.Abc;