一种可能的解决方法是子类化 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);
}
}
}
这种方法有效,但感觉有点脏。我可以做任何改进吗?