我投入了大量基于Microsoft堆栈(W8 / WP8 / Silverlight等)的现有应用程序的Xamarin.Android版本,并且Autofac在整个过程中得到广泛使用。
Autofac更喜欢通过构造函数参数显示依赖关系,这当然假设我,编码人员,可以控制我的ViewModel / Controllers的创建,或者在Android的情况下......活动。
我的问题是:考虑到Android框架负责创建活动,有没有办法以理想的方式使用Autofac?我可以做些什么来拦截活动创建来解决Autofac设计方式的依赖关系?
答案 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);
}
}
}
这种方法有效,但感觉有点脏。我可以做出哪些改进?