无法使用Autofac传递Android上下文

时间:2017-06-25 20:12:20

标签: c# android xamarin.android android-service autofac

我决定尝试给Xarmarin,我想通过Android上下文。

我在今天与Android和Roboguice做了类似的想法。他们有一个提供者工厂,它允许你传递该项目以通过属性注入。

我想尝试使用IoC(理想情况下为Autofac)。我已经按照这个例子:http://arteksoftware.com/ioc-containers-with-xamarin/

我想补充一点,我发现服务很困难,我想通过构造函数注入实例。

你们都能做到吗?

1 个答案:

答案 0 :(得分:0)

  

我决定尝试给Xarmarin,我想通过android上下文。

直接传递android 上下文?不,没有办法做到这一点。接口在PCL中定义,但PCL中没有适当的容器(类型)来接受上下文实例。

但您可以将自己的界面和类定义为利用Context实例

基于您发布的博客演示的示例(利用上下文读取Assets文件夹中的txt文件):

  1. Assets文件夹中添加txt文件(abc.txt),并将其BuildAction设置为AndroidAssets
  2. 在PCL中定义一个新接口:

    public interface IContextUtility
    {
        string GetAssetTxt(string str);
    }
    
  3. 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");
            }
        }
      ...
    }
    
  4. 在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;
        }
    }
    
  5. 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>();
            ...
        }
    }
    
  6. 现在,您可以在MainActivity中使用它:

    var text = viewModel.Abc;