Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 温莎城堡延迟加载服务_.net_Castle Windsor_Lazy Loading - Fatal编程技术网

.net 温莎城堡延迟加载服务

.net 温莎城堡延迟加载服务,.net,castle-windsor,lazy-loading,.net,Castle Windsor,Lazy Loading,有时,我发现自己处于这样一种情况:只有在满足特定条件的情况下,我才需要解决服务问题。例如,用户可能选择发送电子邮件或sms通知。我想根据用户的选择延迟加载电子邮件或sms服务,这样我就不必同时加载它们和浪费资源(例如,如果用户有10个选项会怎么样…?) 我的问题是在引导代码之外使用容器(我不希望我的代码依赖于容器)。我似乎找不到一种方法来使用容器来延迟加载服务(除非我手动创建所需的服务并手动执行所有DI)。这是一种规则可以弯曲的情况,还是有更好的方法呢?如果您使用的是Castle Windsor

有时,我发现自己处于这样一种情况:只有在满足特定条件的情况下,我才需要解决服务问题。例如,用户可能选择发送电子邮件或sms通知。我想根据用户的选择延迟加载电子邮件或sms服务,这样我就不必同时加载它们和浪费资源(例如,如果用户有10个选项会怎么样…?)


我的问题是在引导代码之外使用容器(我不希望我的代码依赖于容器)。我似乎找不到一种方法来使用容器来延迟加载服务(除非我手动创建所需的服务并手动执行所有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();