2017-06-25 3 views
0

私はXarmarinを試してみることにしました。アンドロイドのコンテキストを渡したいと思います。Autofacを使ってAndroidコンテキストを渡すことに失敗しました

私はAndroidやRoboguiceでこのような考えを戻しました。彼らにはプロバイダーファクトリがあり、そのアイテムをプロパティ経由で渡すことができます。

私はこのアプローチをIoC(理想的にはオートファック)で試してみたいと思います。私はこの例に従っています:http://arteksoftware.com/ioc-containers-with-xamarin/

私は、コンストラクタを介してインスタンスを挿入したいサービスでは難しいと思っています。

これはすべてできましたか?

答えて

0

私はXarmarinを試してみることにしました。私はアンドロイドのコンテキストを渡したいと思います。

直接は、アンドロイドを渡しますか?いいえ、それをする方法はありません。インタフェースはPCLで定義されていますが、コンテキストインスタンスを受け入れるための適切なコンテナ(タイプ)がPCLにありません。

しかし、あなたは活用し、コンテキストインスタンスに独自のインタフェースとクラスを定義することができます:あなたが投稿ブログのデモに基づいて

例(資産フォルダ内のtxtファイルを読むためにコンテキストを活用):

  1. Assetsフォルダにtxtファイル(abc.txt)を追加し、それがAndroidAssetsとしてBuildActionだし。
  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でそれを使用することができます。たとえばありがとう:エルビス・夏-msftを@

    var text = viewModel.Abc; 
    
+0

を。私がこの権利を読んだら、あなたはそれができないと言っています。上の例では、アプリケーション[コンテキスト]の周りにコード/クラス/実装を構築することに注意してください。 – KellyTheDev

+0

また....私がやろうとしていることの1つは、クラスを 'Android.App.Service'に挿入することです。この場合、デフォルトのコンストラクタが必要であることが警告されます – KellyTheDev

関連する問題