.net 温莎城堡延迟加载服务
有时,我发现自己处于这样一种情况:只有在满足特定条件的情况下,我才需要解决服务问题。例如,用户可能选择发送电子邮件或sms通知。我想根据用户的选择延迟加载电子邮件或sms服务,这样我就不必同时加载它们和浪费资源(例如,如果用户有10个选项会怎么样…?).net 温莎城堡延迟加载服务,.net,castle-windsor,lazy-loading,.net,Castle Windsor,Lazy Loading,有时,我发现自己处于这样一种情况:只有在满足特定条件的情况下,我才需要解决服务问题。例如,用户可能选择发送电子邮件或sms通知。我想根据用户的选择延迟加载电子邮件或sms服务,这样我就不必同时加载它们和浪费资源(例如,如果用户有10个选项会怎么样…?) 我的问题是在引导代码之外使用容器(我不希望我的代码依赖于容器)。我似乎找不到一种方法来使用容器来延迟加载服务(除非我手动创建所需的服务并手动执行所有DI)。这是一种规则可以弯曲的情况,还是有更好的方法呢?如果您使用的是Castle Windsor
我的问题是在引导代码之外使用容器(我不希望我的代码依赖于容器)。我似乎找不到一种方法来使用容器来延迟加载服务(除非我手动创建所需的服务并手动执行所有DI)。这是一种规则可以弯曲的情况,还是有更好的方法呢?如果您使用的是Castle Windsor 3.0或更高版本,您可以使用惰性解析 看 注册过程略有变化(必须注册新的组件加载器) 之后,您将一如既往地注册组件,但将依赖项解析为
Lazy
,而不是T
。除非您不访问您的惰性
的.Value
属性,否则依赖关系将不会得到解决,因此您可以传递几个惰性计算的对象,并在需要时仅访问所需的对象
如果你有更多的选项给用户,也许你应该考虑创建某种抽象的工厂接口。然后,您将只注册并解析此工厂,工厂本身将创建用于发送通知的适当服务(邮件、sms或任何其他选项)。工厂的实现可以手工编码,也可以用Castle Windsor编码(我认为是3.0版)
通常,当我使用这样的工厂时,我手工实现它,并将容器作为它的依赖项传递给它,所以只有工厂实现依赖于我的容器。通常,您可以使用 简而言之,当您解析使用这些服务的组件时,您没有给它提供电子邮件或sms服务,而是给它一个可以创建它们的工厂(由您定义,不引用容器)
该设施将负责“实施”您的工厂(从您创建的界面),因此无需做什么。只是一个简化的示例(基于Marcin Deptuła答案)
如果我的每个服务都有自己独特的依赖集,该怎么办。例如,sms服务有3个唯一的依赖项,电子邮件服务有4个唯一的依赖项,等等。我是否会将20个(或无论有多少个)依赖项注入工厂?顺便说一句,反应很好。工厂由castle实施。您只需像往常一样配置您的服务。
// activate Lazy initialization feature for all Components
.Register(Component.For<ILazyComponentLoader>().ImplementedBy<LazyOfTComponentLoader>())
// register rest of component(s)
.Register(Component.For<IIssueRepository>().ImplementedBy<IssueRepository>())
. ....
public Lazy<IIssueRepository> IssueRepository { get; set; }
IssueRepository.Value.GetLastIssue();
public IIssueRepository IssueRepository { get; set; }
IssueRepository.GetLastIssue();