3

我正在投入大量构建在 Microsoft 堆栈(W8/WP8/Silverlight 等)上的现有应用程序的 Xamarin.Android 版本,并且 Autofac 被广泛使用。

Autofac 更喜欢通过构造函数参数显示依赖关系,这当然假设我,编码人员,可以控制我的 ViewModels/Controllers 的创建,或者在 Android 的情况下......活动。

我的问题是:考虑到 Android 框架负责 Activity 创建,有什么方法可以以所需的方式使用 Autofac?我可以做些什么来拦截 Activity 创建以解决 Autofac 设计方式的依赖关系?

4

1 回答 1

3

一种可能的解决方法是子类化 Activity,并在可写属性上使用自定义属性标记依赖关系。

然后我们可以使用反射来提取这些属性并使用 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 回答