有没有办法在Xamarin.Android项目中使用Autofac进行构造函数注入?

时间:2013-07-17 20:29:02

标签: xamarin.android autofac xamarin

我投入了大量基于Microsoft堆栈(W8 / WP8 / Silverlight等)的现有应用程序的Xamarin.Android版本,并且Autofac在整个过程中得到广泛使用。

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

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

1 个答案:

答案 0 :(得分:2)

可能的解决方法是将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);
        }
    }
}

这种方法有效,但感觉有点脏。我可以做出哪些改进?