- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的项目中使用 IoC 容器,但我的项目包含许多子模块。我想使用一个基本的 IoC 模块。例子:我在子模块 A 中有两个接口(interface)IOne和ITwo接口(interface)
public interface ITwo
{
// some code
}
public interface IOne
{
// some code
}
还有我的SimpleInjectorRegisterTypes 类
public class SimpleInjectorRegisterTypes : ISimpleInjectorRegistration
{
public void Register(Container container)
{
container.RegisterSingle<ITwo, Two>();
container.RegisterSingle<IOne, One>();
}
}
还有主类,我在其中使用我的逻辑
private static IOne _one;
private static ITwo _two;
static void Main(string[] args)
{
Container container = new Container();
new SimpleInjectorRegisterTypes().Register(container);
_one= container.GetInstance<IOne>();
_two= container.GetInstance<ITwo>();
}
这很好,但是我有子模块 B,其中我有接口(interface) IThree 和 TFour还有 SimpleInjectorRegisterTypes 和主类。如何为我所有的子模块编写一个通用的 IoC 容器?附言对于 IoC,我使用 bootstrapper
最佳答案
假设有 3 个子程序集,比如 Common
, ModuleA
和 ModuleB
.
Common
有ICommon
界面和你的ISimpleInjectorRegistration
界面。ModuleA
有CommonA
工具 ICommon
, 及其独立注册( IOne
: One
, ITwo
: Two
)ModuleB
有CommonB
工具 ICommon
, 及其注册( IThree
: Three
, IFour
: Four
) ModuleA
像这样注册:
public class RegistrationA : ISimpleInjectorRegistration
{
public void Register(Container container)
{
container.Register<IOne, One>();
container.Register<ITwo, Two>();
container.Register<ICommon, CommonA>();
container.RegisterAll<ICommon>(typeof(CommonA));
}
}
和ModuleB
像这样注册:
public class RegistrationB : ISimpleInjectorRegistration
{
public void Register(Container container)
{
container.Register<IThree, Three>();
container.Register<IFour, Four>();
container.Register<ICommon, CommonB>();
container.RegisterAll<ICommon>(typeof (CommonB));
}
}
现在,在主模块中,您可以这样做:
var container = new Container();
new ModuleA.RegistrationA().Register(container);
new ModuleB.RegistrationB().Register(container);
container.Verify();
但它在 ModuleB
上失败了注册,因为ICommon
在两个注册中都是重复的。
您可以使用Options.AllowOverridingRegistrations
避免重复注册并强制替换为最新的注册。 :
var container2 = new Container();
container2.Options.AllowOverridingRegistrations = true;
new ModuleA.Registration().Register(container2);
new ModuleB.Registration().Register(container2);
container2.Options.AllowOverridingRegistrations = false;
container2.Verify();
var commonInstance2 = container2.GetInstance<ICommon>();
var commonInstances2 = container2.GetAllInstances<ICommon>();
因此,commonInstance2
将是 CommonB
的实例和 commonInstances2
将是 ICommon
的序列包含单个 CommonB
实例。
你可能想得到 CommonA
作为ICommon
.或者获取 ICommon
的所有实现作为IEnumerable<ICommon>
:
var container3 = new Container();
container3.Options.AllowOverridingRegistrations = true;
new ModuleA.Registration().Register(container3);
new ModuleB.Registration().Register(container3);
// you can choose which ICommon should be registered.
container3.Register<ICommon, ModuleA.CommonA>();
// or collect all implementation of ICommon
// (of course using Assembly.GetTypes() is better solution)
container3.RegisterAll<ICommon>(typeof (ModuleA.CommonA), typeof (ModuleB.CommonB));
container3.Options.AllowOverridingRegistrations = false;
container3.Verify();
var commonInstance3 = container3.GetInstance<ICommon>();
var commonInstances3 = container3.GetAllInstances<ICommon>();
因此,commonInstance3
将是 CommonA
实例和 commonInstances3
将同时包含 CommonA
和 CommonB
实例。
关键是,注册依赖项时应该保持简单。只有一个地方是理想的,但如果您有独立的模块并且每个模块都不知道彼此,知道两个模块的“主要”应该正确配置注册。
关于c# - 创建整体 IoC 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29385073/
我正在阅读Head First Design Patterns一书,在第382页上说: Composite Patterns is used when you have collection of o
我将我的电脑用作 wifi 热点,并将其他设备连接到它。然后使用wireshark,我可以看到特定设备上发送/接收的数据包,但是我怎样才能看到设备正在查看的完整网页而不是单独的数据包? 最佳答案 尝试
在 URL 中打开我的 Jenkins 时,我似乎无法登录它会抛出消息“用户缺少整体/读取权限”。我试过answer来自类似的问题,但禁用安全性不起作用。 Jenkins 继续抛出错误。有人建议我一起
我已经使用工具分配测试了我的应用程序并得到了这张图片: 如图所示,我的应用程序正常工作,但它通常以总字节数计值吗?我担心“#Allocations (Net/Overall)”,因为它的颜色是红色。这
我遵循教程 Deployment on Tomcat without modification of monitored webapps (beta) .监控站点正在运行,我可以看到统计页面。问题是
所以我有一个 div,其中整个东西都是一个 anchor 标记,我试图控制颜色在悬停时的显示方式并获得不同的结果。希望我能用 CSS 做到这一点。发生的事情是悬停,一个文本发生变化,但另一个没有。但是
我创建了一个程序,您可以在其中输入行驶的英里数和每 jar 油使用的加仑数,该程序会显示每 jar 油的 mpg。我使用的是 Visual Studio 2010。当我输入标记值 -1 时,系统会给出
我有一个由 N 个节点组成的 zookeeper 集群(彼此了解)。如果我在 zk 客户端连接字符串中只传递 M < N 个节点地址怎么办?集群的行为是什么? 在更具体的情况下,如果我只从集群中传递
我一直在试图弄清楚当使用诸如 pushViewController:animated、presentModalViewController:animated 和 UITabBarViewControl
我已经在 VIM 中安装了 minikube,并且我拥有具有所有权限的服务帐户 token 。是否有来自 kubernetes 的 API 来获取资源使用情况(总体)。 最佳答案 要获取 CPU 和内
如何通过 HTTP 客户端(例如 CURL、Insomnia、Postman 等)快速使用使用 JWT token 的 JHipster 生成的应用程序? 最佳答案 嗯,我研究了一段时间,发现你必须遵
我是一名优秀的程序员,十分优秀!