- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们有一个 web api 项目,它引用了一个在许多不同系统之间共享的库。
该库公开了一个“RegisterDependancies(IWindsorContainer container)”函数,调用该函数时将为该特定库注册所有依赖项。
因此,当 web api 应用程序启动时,它会进行自己的注册,然后调用共享库,类似于以下伪代码:
public void SetupWindsor(){
IWindsorContainer container = new WindsorContainer();
container.Register(Component.For<iFoo>().ImplementedBy<Foo>());
SharedLibrary.RegisterDependancies(container);
}
共享库函数看起来有点像这样:
public void RegisterDependancies(IWindsorContainer container)
{
container.Register(Component.For<iBar>().ImplementedBy<Bar>());
//In this instance Bar is internal so could not be registered by the api project.
}
我们现在希望 web api 项目使用 PerWebRequest 生活方式,但其他系统可能希望使用不同的生活方式(这个决定将取决于编写客户端应用程序的人 - 共享库将用于控制台和 Windows 应用程序 -所以 perwebrequest 不适合他们使用)
我们想更改 RegisterDependancies 方法,以便我们可以传递生活方式。
是否可以使用 PerWebRequest 生活方式来做到这一点?我们中的一些人看了一眼,却不知道如何去做 - 尽管过去曾做过类似的事情而没有出现统一问题。
我们正在寻找一种方法来解决所描述的问题,或者如果有更好的方法来解决这个问题也会有所帮助。
编辑以澄清,共享库将接口(interface) IBar 定义为公共(public)接口(interface),但将类 Bar 定义为内部接口(interface),因此 API 无法进行注册 - 除非温莎有一些我不知道的魔法。
最佳答案
the shared library defines the interface IBar as public but the class Bar as internal so the API cannot do the registration
让我们花点时间研究一下这个设计决策。虽然没有外部调用者可以创建 Bar
对象,但他们可以创建 IBar
对象:
IWindsorContainer container = new WindsorContainer();
SharedLibrary.RegisterDependancies(container);
IBar bar = container.Resolve<IBar>();
保留 Bar
类 internal
的原因可能有多种,但既然您已经可以运行上面的代码,为什么不简单地让共享库公开一个工厂?
IBar bar = SharedLibrary.CreateBar();
那会简单得多,并且可以将共享库与容器分离。一般来说,这是我能给出的关于依赖注入(inject)和可重用库的最佳建议:使用依赖注入(inject)模式,而不是容器。看我的文章DI-Friendly Library了解更多详情。
如果您仍想在宿主项目(例如 Wep API 项目)中使用 DI 容器,您可以针对该静态工厂方法注册 IBar
。
人们想要保留一些类 internal
是有正当理由的,但我经常看到代码库中的类是 internal
的,原因不明。我对几十年的 C# 代码的经验是,类是 internal
没有充分理由的情况远远超过有充分理由的情况。
Bar
真的必须是内部的吗?为什么?
从 OP 可以清楚地看出 IBar
是由 Bar
实现的。这可能是将问题简化为基本要素的人工产物(干得好,顺便说一句),但我的印象是Bar
是唯一的 实现 IBar
的类。是这样吗?
如果是这样,Bar
类必须公开IBar
定义的方法。这样,类的API就已经公开了,为什么要隐藏类呢?那么,唯一隐藏的是构造函数...
有时,当我提出上述建议时,我会得到这样的答复,即这不是问题的重点。问题是关于如何改变温莎城堡的生活方式(顺便说一句,you can)。
另一方面,这个问题几乎是完美的(小) Storm ,它说明了为什么可重用库不应该依赖 DI 容器:
这使事情变得复杂 - 因此 Stack Overflow 上出现了这个问题。
我最好的建议是让事情保持简单。消除对 CaSTLe Windsor 的依赖将使库开发和重用更容易,而不是更难。
如果您公开大多数库类,使用库会更容易。
关于c# - 寻找将温莎生活方式带入图书馆的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55942172/
题: 是否有一种简单的方法可以获取正在运行的应用程序中泄漏的资源类型列表? IOW 通过连接到应用程序? 我知道 memproof 可以做到,但它会减慢速度,以至于应用程序甚至无法持续一分钟。大多数任
正确地说下面的代码会将自定义日志发送到.net核心中的Docker容器的stdout和stderr吗? console.Writeline(...) console.error(..) 最佳答案 如果
我想将一个任务多次重复,放入 for 循环中。我必须将时间序列对象存储为 IExchangeItem , openDA 中的一个特殊类(数据同化软件)。 这是任务之一(有效): HashMap ite
我需要从文件中读取一个数组。该数组在文件中不是连续排序的,必须跳转“偏移”字节才能获得下一个元素。假设我读取一个非常大的文件,什么更有效率。 1) 使用增量相对位置。 2)使用绝对位置。 选项 1:
我有一个安装程序(使用 Advanced Installer 制作)。我有一个必须与之交互的应用程序,但我不知道如何找到该安装的 MSIHANDLE。我查看了 Microsoft 引用资料,但没有发现
我在替换正则表达式中的“joe.”等内容时遇到问题。这是代码 var objects = new Array("joe","sam"); code = "joe.id was here so was
我有 A 类。A 类负责管理 B 对象的生命周期,它包含 B 对象的容器,即 map。 ,每个 B 对象都包含 C 对象的容器,即 map .我有一个全局 A 对象用于整个应用程序。 我有以下问题:我
任何人都可以告诉我在哪里可以找到 freeImage.so 吗?我一直在努力寻找相同的东西但没有成功..任何帮助将不胜感激。我已经尝试将 freeimage.a 转换为 freeImage .so 并
在单元测试期间,我想将生成的 URL 与测试中定义的静态 URL 进行比较。对于此比较,最好有一个 TestCase.assertURLEqual 或类似的,它可以让您比较两个字符串格式的 URL,如
'find ./ -name *.jpg' 我正在尝试优化上述语句的“查找”命令。 在查找实现中处理“-name”谓词的方法。 static boolean pred__name __common (
请原谅我在这里的困惑,但我已经阅读了关于 python 中的 seek() 函数的文档(在不得不使用它之后),虽然它帮助了我,但我仍然对它的实际含义有点困惑,任何非常感谢您的解释,谢谢。 最佳答案 关
我在我正在使用的库中找到了这个语句。它应该检查集群中的当前节点是否是领导者。这是语句:(!(cluster.Leader?.IsRemote ?? true)) 为什么不直接使用 (cluster.L
我发现 JsonParser 在 javax.json.stream 中,但我不知道在哪里可以找到它。谁能帮帮我? https://docs.oracle.com/javaee/7/api/javax
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 6年前关闭。 Improve this questi
如果 git 存储库中有新的更改可用,我有一个多分支管道作业设置为每分钟由 Jenkinsfile 构建。如果分支名称是某种格式,我有一个将工件部署到环境的步骤。我希望能够在每个分支的基础上配置环境,
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我想我刚刚意识到当他们不让我使用 cfdump 时我的网络主机是多么的限制。这其实有点让我生气,真的,dump 有什么害处?无论如何,我的问题是是否有人编写了一个 cfdump 替代方案来剔除复杂类型
任务:我有多个资源需要在一个 HTTP 调用中更新。 要更新的资源类型、字段和值对于所有资源都是相同的。 示例:通过 ID 设置了一组汽车,需要将所有汽车的“状态”更新为“已售出”。 经典 RESTF
场景:表中有 2 列,数据如下例所示。对于“a”列的相同值,该表可能有多个行。 在示例中,考虑到“a”列,“1”有三行,“2”有一行。 示例表“t1”: |a|b ||1|1.1||1|1.2||1
我有一个数据框: Date Price 2021-01-01 29344.67 2021-01-02 32072.08 2021-01-03 33048.03 2021-01-04 32084.
我是一名优秀的程序员,十分优秀!