0

それはおそらく私の質問の一部です。

基本的に、バージョン 1.1.2 の実際のインジェクションに苦労しています。このサイトのいくつかのページを読みましたが、何かが足りないと感じました。

基本的に、RoboApplication 拡張機能を実行しました。addApplicationModules メソッドをオーバーライドしました。モジュールも作りました。

私のモジュールは次のようになります。

    public class DataRepository extends AbstractAndroidModule
    {

        @Override
        protected void configure() {
             /*
              * This tells Guice that whenever it sees a dependency on a TransactionLog,
              * it should satisfy the dependency using a DatabaseTransactionLog.
              */
            bind(IDataBaseAdapter.class).to(DataBaseAdapter.class);
        }

    }

私のアダプターにはこれがあります:

    public class DataBaseAdapter implements IDataBaseAdapter
    {
        private DataBaseHelper _dbHelper;

        private SQLiteDatabase _db;

        @Inject 
        protected static Provider<Context> contextProvider;

        public DataBaseAdapter()
        {
            _dbHelper = new DataBaseHelper(contextProvider.get());
        }
    }

私がそこにいない場合、コードのチャンクが存在する適切な場所はどこですか...インジェクターを関連付ける場所はどこですか?

最後に...私のアプリケーションには次のように注入されます:

    public class MyApplication extends RoboApplication 
    {
        public MyApplication()
        {
            super();
        }

        public MyApplication(Context context)
        {
            super();
            attachBaseContext(context);
        }

        @Override
        protected void addApplicationModules(List<Module> modules)
        {
            modules.add(new DataRepository());
        }

        @Inject
        private IDataBaseAdapter adapter;

        public IDataBaseAdapter getAdapter()
        {
            return adapter;
        }

        public void setAdapter(IDataBaseAdapter value)
        {
            adapter = value;
        }
            ...
    }

示されているように、Inject 属性を使用しようとしています。例えば:

    @Inject 
    private IDataProvider provider; 

私が道に迷ったいくつかの理由は、私が .NET と Flash/ActionScript のバックグラウンドを持っていることと、(.NET の世界では) Ninject の代わりに StructureMap しか使用していないことです。 Ninjectのアイデアを念頭に置いています。誰かがこの小さなピースを理解するのを手伝ってくれませんか?

RoboGuice の 2.x にジャンプするのではなく、1.1.2 を使用することに集中したいと思います...特にまだベータ版であるため、気にしないでください。

ありがとう、ケリー

4

2 に答える 2

0

Android は、スタンドアロン/ホストされた Java アプリケーションとはまったく異なります。main() はありませんが、Android フレームワーク (アクティビティ、サービス、ブロードキャスト レシーバー) によって管理される特定のアクティビティ ユニットがあります。

DI は、適切なオブジェクト指向の方法でパーツを相互に接続することにより、ブーラー プレート コードを排除できるようにする手法です。

あなたの作業単位は主に活動であるため、 onCreate() メソッドで共同作業オブジェクトの接続/作成を行う必要があり、専用の onResume() および onPause() メソッドがあります (活動のライフサイクルを参照)

経験則では、アクティビティがフォーカスを失うたびに、これを再起動する必要がありますか? はいの場合は inResume() / onPause() で初期化/破棄し、そうでない場合は onCreate() で

また、アプリケーション全体 (同じ JVM で実行中) とオブジェクトを共有したい場合は、Android でシングルトン パターンを使用しても問題ありません。したがって、シングルトン インジェクター factory があれば、どこからでもアクセスできます。

 InjectorFactory.getInstance(<context if necessary?>).getInstance(whatever you need);
于 2011-12-12T07:48:32.920 に答える
0

わかりました。必要なものはわかりましたが、そこに浮かんでいるすべての情報を見た後で、その理由がよくわかりません。

私は基本的にこの変更を行いましたが、今はテストに合格しています。

public class DataBaseAdapter implements IDataBaseAdapter
{
    private DataBaseHelper _dbHelper;

    private SQLiteDatabase _db;

    @Inject
    public DataBaseAdapter(Provider<Context> contextProvider)
    {
        _dbHelper = new DataBaseHelper(contextProvider.get());
    }
}

インジェクションのツールとしてコンストラクターを使用するのは好きですが、私が見た例がある種のリフレクション クラス インジェクションであることを考えると、なぜこのように機能しなければならなかったのか疑問に思います。

とにかくこの部分です。うまくいけば、他の誰かがこれが役に立つと思うでしょう。

乾杯、ケリー

于 2011-12-14T05:17:51.910 に答える