3

私は、Microsoft スタック (W8/WP8/Silverlight など) に大きく基づいて構築された既存のアプリの Xamarin.Android バージョンを投入しており、全体で Autofac が広く使用されています。

Autofac は、コンストラクター パラメーターを介して依存関係を表示することを好みます。これはもちろん、コーダーである私が ViewModels/Controllers の作成、または Android の場合は ... アクティビティーの作成を制御できることを前提としています。

私の質問は次のとおりです:Androidフレームワークがアクティビティの作成を担当していることを考慮して、希望する方法でAutofacを使用できる方法はありますか? Autofac が設計されている方法で依存関係を解決するためにアクティビティの作成を傍受するためにできることはありますか?

4

1 に答える 1

3

可能な回避策は、アクティビティをサブクラス化し、書き込み可能なプロパティのカスタム属性で依存関係をマークすることです。

次に、リフレクションを使用してそれらのプロパティをヤンクし、Autofac を使用してそれらを挿入できます。これは、コンストラクターで依存関係をマークするという Autofac の規則には従いませんが、MEF が行うように、ジョブを完了し、プロパティを挿入します。

public class AutofacActivity : Activity
{
    private static ContainerBuilder ContainerBuilder { get; set; }

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate (bundle);
        // Bootstrap
        if (Core.IoC.Container == null) {
            new Bootstrapper ().Bootstrap ();
        }

        PropertyInfo[] properties =
            this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);            

        foreach (var property in properties.Where(p=>p.GetCustomAttributes(typeof(InjectAttribute), false).Any())) {

            object instance = null;
            if (!Core.IoC.Container.TryResolve (property.PropertyType, out instance)) {
                throw new InvalidOperationException ("Could not resolve type " + property.PropertyType.ToString ());
            }

            property.SetValue (this, instance);
        }
    }
}

この方法は機能しますが、少し汚れているように感じます。私ができる改善点はありますか?

于 2013-07-17T20:32:37.210 に答える