【发布时间】:2015-04-09 12:21:06
【问题描述】:
我有一个接口、实现和目标:
public interface IPerson { public string Name { get; } }
public class Person: IPerson { public string Name { get { return "John"; } } }
public class Target { public Target(IPerson person) {} }
我正在使用 Autofac 将事情联系在一起:
builder.RegisterType<Person>().As<IPerson>().SingleInstance();
问题在于IPerson 存在于共享程序集中,Person 存在于插件中(可能存在也可能不存在),Target 存在于加载插件的主应用程序中。如果没有加载实现IPerson 的插件,Autofac 会因为无法解析Target 的依赖关系而大发雷霆。我真的不能为此责备它。
但是我知道Target 能够处理缺少IPerson 的问题,并且非常乐意获得null。事实上,我很确定所有依赖IPerson 的组件都准备好用null 代替它。那么我该如何告诉 Autofac - “没关系,亲爱的,别担心,给我回个 null,好吗?”
我发现的一种方法是给Target添加一个默认参数:
public class Target { public Target(IPerson person = null) {} }
这行得通,但是我需要为所有需要IPerson 的组件执行此操作。我也可以反过来做吗?以某种方式告诉 Autofac“如果所有其他方法都无法解析 IPerson,则返回 null”?
【问题讨论】:
-
另见
ResolveOptional()。 -
如果
Person存在于插件中,如何注册?这个电话去哪儿了?builder.RegisterType<Person>().As<IPerson>().SingleInstance(); -
@SriramSakthivel - 每个插件都有一个由主应用程序调用的
Initialize(ContainerBuilder)方法。插件在那里注册它们的组件。
标签: .net autofac default-value