如何更改 Spring.Net 中的配置

2023-12-14

IoC 容器的一个优点是您可以在对象图底部交换模拟服务。然而,这在 Spring.Net 中似乎比在其他 IoC 容器中更难做到。下面是一些在 Unity 中执行此操作并具有 Spring.Net 代码的代码;

namespace IocSpringDemo
{
    using Microsoft.Practices.Unity;
    using NUnit.Framework;

    using Spring.Context;
    using Spring.Context.Support;

    public interface ISomeService
    {
        string DoSomething();
    }

    public class ServiceImplementationA : ISomeService
    {
        public string DoSomething()
        {
            return "Hello A";
        }
    }

    public class ServiceImplementationB : ISomeService
    {
        public string DoSomething()
        {
            return "Hello B";
        }
    }

    public class RootObject
    {
        public ISomeService SomeService { get; private set; }

        public RootObject(ISomeService service)
        {
            SomeService = service;
        }
    }

    [TestFixture]
    public class UnityAndSpringDemo
    {
        [Test]
        public void UnityResolveA()
        {
            UnityContainer container = new UnityContainer();
            container.RegisterType<ISomeService, ServiceImplementationA>();
            RootObject rootObject = container.Resolve<RootObject>();
            Assert.AreEqual("Hello A", rootObject.SomeService.DoSomething());
        }

        [Test]
        public void UnityResolveB()
        {
            UnityContainer container = new UnityContainer();
            container.RegisterType<ISomeService, ServiceImplementationB>();
            RootObject rootObject = container.Resolve<RootObject>();
            Assert.AreEqual("Hello B", rootObject.SomeService.DoSomething());
        }

        [Test]
        public void SpringResolveA()
        {
            IApplicationContext container = ContextRegistry.GetContext();
            RootObject rootObject = (RootObject)container.GetObject("RootObject");
            Assert.AreEqual("Hello A", rootObject.SomeService.DoSomething());
        }

        [Test]
        public void SpringResolveB()
        {
            // does not work - what to do to make this pass?
            IApplicationContext container = ContextRegistry.GetContext();
            RootObject rootObject = (RootObject)container.GetObject("RootObject");
            Assert.AreEqual("Hello B", rootObject.SomeService.DoSomething());
        }
    }
}

为了 Spring 的优势,App.config 文件中需要包含以下内容。显然,这仅适用于第一次春季测试,而不适用于第二次。您可以在配置文件中放置多个 spring 配置吗?如果是这样,语法是什么以及如何访问它们?或者还有其他方法可以做到这一点吗?

  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>
  <spring>
    <context>
      <resource uri="config://spring/objects"/>
    </context>
    <objects xmlns="http://www.springframework.net">
      <object name="RootObject" type="IocSpringDemo.RootObject, IocDemo" autowire="constructor" />
      <object name="service" type="IocSpringDemo.ServiceImplementationA, IocDemo" autowire="constructor" />
    </objects>
  </spring>

Update

这是基于代码的部分答案Marko Lahma 提供的 Mark Pollack 博客的链接。我通过了上述测试,代码如下:

public static class SpringHelper
{
    public static T Resolve<T>(this IApplicationContext context, string name)
    {
        return (T)context.GetObject(name);
    }

    public static void RegisterType<T>(this GenericApplicationContext context, string name)
    {
        context.RegisterType(name, typeof(T));
    }

    public static void RegisterType(this GenericApplicationContext context, string name, Type type)
    {
        IObjectDefinitionFactory objectDefinitionFactory = new DefaultObjectDefinitionFactory();
        ObjectDefinitionBuilder builder = ObjectDefinitionBuilder.RootObjectDefinition(objectDefinitionFactory, type);
        builder.SetAutowireMode(AutoWiringMode.AutoDetect);

        context.RegisterObjectDefinition(name, builder.ObjectDefinition);
    }
}

...

    [Test]
    public void SpringResolveA()
    {
        GenericApplicationContext container = new GenericApplicationContext();
        container.RegisterType<RootObject>("RootObject");
        container.RegisterType<ServiceImplementationA>("service");

        RootObject rootObject = container.Resolve<RootObject>("RootObject");
        Assert.AreEqual("Hello A", rootObject.SomeService.DoSomething());
    }

    [Test]
    public void SpringResolveB()
    {
        GenericApplicationContext container = new GenericApplicationContext();
        container.RegisterType<RootObject>("RootObject");
        container.RegisterType<ServiceImplementationB>("service");

        RootObject rootObject = container.Resolve<RootObject>("RootObject");
        Assert.AreEqual("Hello B", rootObject.SomeService.DoSomething());
    }

这向我提出了几个问题:

  • 我想将此技术集成到使用常用容器的现有代码中。为什么我必须使用不同的容器类型,GenericApplicationContext在这种情况下?如果我想从 app.config 或 web.config 中现有的 spring 配置中将数据读入该对象,该怎么办?它会像通常的上下文一样工作吗?然后我可以用代码在这些注册上写入数据吗?

  • 我该如何指定ISomeService是作为单例创建的吗?我的意思并不是向容器提供单例实例,而是为容器提供创建实例、解析其构造函数并在需要该类型时使用它的容器。

  • 我怎样才能做相当于container.RegisterType<ISomeService, ServiceImplementationA>();?我想注册类型映射以在构造函数需要该类型的所有情况下使用。

  • 到底是做什么的container.RegisterType<ServiceImplementationA>("service");做?好像要注册ServiceImplementationA作为实施ISomeService but ISomeService从未提及,因此可能存在歧义。例如如果什么ServiceImplementationA实现了多个接口。

  • 注册时指定的字符串名称是什么?它不适用于空字符串,但它是什么似乎并不重要。

我是否尝试以一种不起作用的方式使用 spring?我尝试像其他 IoC 容器一样使用它,但它不太有效。


添加为新答案,试图解决开放点......

我想整合这项技术 到使用通常的现有代码中 容器。为什么我必须使用 不同的集装箱类型, GenericApplicationContext 在此 案件?如果我想读取数据怎么办 这个对象来自现有的 spring app.config 或 web.config 中的配置? 它会像通常的上下文一样工作吗? 然后我可以在这些上写入数据吗 用代码注册?

Spring 为不同类型的初始化策略提供了具体的应用程序上下文实现。最常用的是 GenericApplicationContext(手动)、XmlApplicationContext(XML 文件)和 WebApplicationContext(非常类似于 XmlApplicationContext,但专为 Web 使用而定制)。它们都实现通用接口:IApplicationContext,这是访问这些容器的首选方式。

不幸的是,用代码更改注册通常意味着您需要直接使用特定的子类。对于 GenericApplicationContext 和 StaticApplicationContext,这是很自然的,但 XmlApplicationContext 通常被认为只是 XML,并且这种方式“固定”到 XML 定义。

我如何指定 ISomeService 是 被创建为单例?我不 意味着提供一个单例实例 容器,但容器 创建实例,解析其 构造函数,并在该类型时使用它 是需要的。

SpringHelper 就是这样做的,默认情况下 Spring 中的所有对象都是单例。您可以通过使用 false 调用 ObjectDefinitionBuilder 的 SetSingleton 方法来更改此行为。

我怎样才能做相当于 容器.RegisterType(); ?我想要 要在所有中使用的寄存器类型映射 需要该类型的情况 构造函数。

Spring 使用对象名称 (ids) 来区分不同的实现。因此,如果您想获取特定类型来服务特定实例,以防有许多替代方案,您应该按名称引用该特定实例。如果您正在使用自动装配,并且您的对象依赖于接口 ISomeService,并且只有一个注册的对象实现它,则自动装配可以毫无歧义地设置它。

到底是做什么的 容器.RegisterType(“服务”); 做?好像要注册 ServiceImplementationA 作为 ISomeService 的实现但是 ISomeService 从未被提及,所以 可能存在歧义。例如如果什么 ServiceImplementationA已实施 多个接口。

继续之前的答案,这会注册 ServiceImplementationA 类型的单例,名称为“service”。该对象具有自动装配候选者及其所有实现的接口(当然还有它的具体类型)。

赋予的字符串名称是什么 注册为?它不能与 en 空字符串,但似乎不是 不管它是什么。

正如前面所解释的,这非常重要。该名称是该上下文中的唯一 ID(父上下文可以具有相同名称的对象),并且可用于访问特定的对象注册。简而言之,其他框架可能将类型关联为对象注册的关键,而 Spring 使用名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改 Spring.Net 中的配置 的相关文章

  • 如何覆盖温莎城堡中注册的组件?

    我刚刚开始使用 Windsor 所以请温柔点 我有一个场景 我希望能够覆盖 替换放置在 Windsor 容器内的组件 继续阅读 在我的产品代码中 我希望能够注册一个实现基类的组件 并使用容器来解析实现者 到目前为止 使用 container
  • 每个开发人员对 C# 类库的配置设置不同

    我们是一个小团队 致力于 ASP NET Web 项目以及服务 这两个项目都依赖于共享类库 我们希望每个开发人员的类库设置都不同 以及稍后的生产 设置中包含敏感信息 例如密码和主机名 我们应该如何分配这些设置 除非我错了 否则 web co
  • 是否可以使用 AndroidAnnotations 注入模拟以进行测试?

    我还没有找到任何关于如何执行此操作的示例 我假设基于这样的例子这是不可能的 Bean MyImplementation class MyInterface myInterface 其中要注入的类已经确定 的补充johncarl answer
  • .NET 配置节设计器 - 我的集合在哪里?

    我正在使用配置部分设计器 http csd codeplex com 为 NET构建一个简单的ConfigurationElementCollection It appears一切都构建得很好 并且代码是自动生成的 因为子元素通过 Inte
  • 何时使用 IOC 容器?

    我试图了解何时应该使用容器而不是手动注入依赖项 如果我有一个使用 1 2 个接口的应用程序 并且每个接口只有 1 2 个具体实现 我会倾向于自己处理 如果我有一个使用 2 3 个接口的小型应用程序 并且每个接口有 2 3 个具体实现 我应该
  • 从流而不是文件加载配置文件

    我使用 OpenMappedExeConfiguration 和 ExeConfigurationFileMap 来加载配置文件 它们的重载表明它们只适用于文件名 有没有办法从流加载配置文件 背景 我想加载存储为嵌入式资源的配置文件 没有文
  • Castle Windsor 或 Spring.NET - 优点和缺点 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Unity静态工厂扩展

    我似乎无法在任何地方找到 Microsoft Practices Unity StaticFactory dll 还有其他注册静态工厂的方法吗 寻找类似的东西 容器 RegisterFactory gt FooFactory CreateF
  • 如何防止 IIS 默认站点 web.config 文件被虚拟目录继承?

    我在默认 IIS 站点的 web config 文件中有以下代码
  • 安装期间初始化 user.config 或 app.exe.config

    我正在开发一个 NET WinForms 应用程序 它依赖于 user config 来存储各种有用的设置 例如 Intranet Web 服务 URL 我们希望能够在安装过程中导入自定义初始设置 其用例是 如果一家公司想要在 100 台计
  • 将 AutoFac 设置为默认使用 PropertiesAutowired(true) 吗?

    有没有办法我可以将 AutoFac 设置为使用 PropertiesAutowired true 作为所有注册类型的默认值 即我不想一直使用 Properties Autowired true var builder new Contain
  • IServiceLocator 接口是什么?

    据我了解 IServiceLocator 是一个抽象实际 IoC 容器的接口 我问的是与 Prism 相关的问题 我想在哪里用 Prism 替换 Unity https stackoverflow com questions 2621248
  • 清漆配置文件在哪里?

    我刚刚安装了清漆并准备好提供网页服务 问题是我们达到了打开文件限制 我们已经设定了ulimit给清漆用户 我们想要找到一个可以写入此配置的文件 Maximum number of open files NFILES 131072 Locke
  • 从主目录隐藏八度工作区文件

    我想更改文件octave workspace从我的主目录中 只需将其重命名为 octave workspace 如何设法使 Octave 识别具有此新名称的工作区文件 或创建一个新文件 Thanks 这就是该组织的目的octave core
  • 无法使用 Spring.NET 将依赖项注入到 Azure WorkerRole 对象

    我在使用 spring net 4 0 和 nhibernate 3 0 开发基于 ASP net 的 Web 应用程序方面拥有一定的经验 最近我遇到了一种情况 我需要使用 spring net 来注入我的服务依赖项 这些依赖项属于Work
  • 是否可以在 app.config 键值中包含超链接?

    是否可以将超链接作为 app config 键值对中文本的一部分 电子邮件正文文本作为值 我想从 app config 键值生成电子邮件正文 例如
  • 在 c:\ProgramFiles\ 下时忽略 .Net app.config 文件

    我有一个奇怪的现象 我有 Net 4 0 应用程序 当 myapp exe config 位于普通的 programfiles 文件夹下时 它将被忽略 即使我删除它或在其中写入废话 myapp exe 仍然可以工作 并且在我看来 这些值是从
  • Java - 从配置文件加密/解密用户名和密码

    我们正忙于为客户开发 Java Web 服务 有两种可能的选择 将加密的用户名 密码存储在Web服务客户端上 从配置中读取 文件在客户端 解密并发送 将加密的用户名 密码存储在 Web 服务器上 从配置中读取 Web 服务器上的文件 解密并
  • Castle Windsor - 如何根据构造函数参数解析组件

    假设我有一个这样的组件 public class MyComponent public MyComponent string name 我基本上希望在解析它时将提供的构造函数参数作为组件标识符的一部分 如果您从未使用该组参数解决它 它将实例
  • SimpleIoC - 在缓存中找不到类型:Windows.UI.Xaml.Controls.Frame

    第一次由 SimpleIoC 实例化我的 ViewModel 时 我遇到了以下错误 我相信我已经按应有的方式设置了容器 但由于某种原因 我仍然收到以下错误 任何想法或帮助将非常感激 Microsoft Practices ServiceLo

随机推荐

  • 共享控制以维护 One-Drive 上的 Access 数据库

    我们有一个中央 Access 数据库 附有较小的外围数据库 我们希望不在同一地点的多个用户可以通过网络使用该数据库 目前我们的数据库位于 OneDrive 上 我们还想在编辑数据库时锁定数据库 我看到 StackOverflow 上有一篇
  • 如何在 firebase 托管 (node.js) 中返回 204 响应代码

    需要一些帮助 我正在尝试使用 android 应用程序访问 firebase 托管上的文件 该应用程序正在下载 txt 文件 并且出于验证原因 在开始下载之前 它应该检查服务器是否可访问 它需要 204 响应代码 没有内容 我可以在 PHP
  • “报告为空” - 是错误吗?

    我已经在 iReport 中创建了带有 3 个参数的报告 并且它运行成功 该报告是使用 3 个参数执行 MS SQL 存储过程 开始日期 enddate dept nm 部门名称 iReport 给出了很好的结果 当我将 jrxml 文件导
  • 全屏iframe高度为100%

    所有浏览器都支持 iframe height 100 吗 我使用 doctype 作为 在我的 iframe 代码中 如果我说 我的意思是它实际上会占据剩余页面的高度 因为顶部有另一个框架 其固定高度为 50px 所有主要浏览器 IE Fi
  • ADFS 2.0 无效名称 ID 策略

    我已经在 adfs 信赖方信任上配置了一个应用程序 因此我可以使用 adfs sso 登录 之后 我安装了 simplesamlphp 来处理该登录 并处理响应 saml 这是我的 authsources 配置 myauth gt arra
  • 关于 iPhone 的方向

    如何获取iPhone当前的方向 我浏览了这个网站 发现了以下两种方法 UIApplication共享应用程序 statusBarOrientation UIDevice currentDevice 方向 哪一种是获取当前方向的正确方法 我在
  • constexpr 使用静态函数初始化静态成员

    要求 我想要一个constexpr值 即编译时常量 计算自constexpr功能 我希望这两个范围都限定在类的命名空间内 即类的静态方法和静态成员 第一次尝试 我首先以 对我来说 显而易见的方式写下这个 class C1 constexpr
  • 有没有办法以编程方式确定字体文件是否具有特定的 Unicode 字形?

    我正在开发一个生成 PDF 的项目 其中可以包含相当复杂的数学和科学公式 文本以 Times New Roman 格式呈现 它具有相当不错的 Unicode 覆盖率 但并不完整 我们有一个系统可以用更完整的 Unicode 字体来替换 TN
  • Big Query 作业失败,并显示“遇到错误字符 (ASCII 0)”。

    我的工作因错误而失败 行 14222274 字段 1 遇到错误字符 ASCII 0 文件的其余部分未处理 数据已被压缩 并且我已验证文件中不存在 ASCII 0 字符 文件中只有 14222273 行 因此错误消息中打印的行号是文件末尾之后
  • Windows 窗体解析问题

    我在 Windows 窗体中开发了 1024 780 分辨率的屏幕 但有人说它在更高分辨率下无法正常显示 有什么办法可以处理这个问题吗 有没有办法让 Windows 窗体应用程序在所有分辨率下看起来都一样 我的建议并不是在所有屏幕上 使其看
  • 使用 EPPlus 将图像添加到 Excel 中

    我正在尝试使用 EPPlus 将同一图像多次添加到 Excel 文件中 我正在使用以下代码来执行此操作 Image logo Image FromFile path ExcelPackage package new ExcelPackage
  • 如何在Excel中对日期进行排序而不重复

    早上好 我有一个关于 Excel 中日期排名的问题 请参见下图 在排名栏中 我用了公式 RANK A3 A A 1 但这不是我想要的 我只希望相同的日期共享与我的目标格式列中显示的相同的排名 谁能告诉我应该应用什么公式来实现这个目标 非常感
  • 蚂蚁为其他蚂蚁服务

    我有几个项目 其中大多数都有 test 目标 运行测试并将结果存储在属性中 测试失败 所有项目都位于同一目录中 大项目 someproject1 big project someproject1 build xml big project
  • Angular Fire Auth 后未收到响应

    使用 AngularFire 注册用户后 我没有收到响应 用户电子邮件出现在 Angular 的身份验证基础上 但登录行为空 并且似乎没有执行 console log 函数 这是我的代码 希望你能帮助我 谢谢 app controller
  • 有没有办法从实例中获取平台和操作系统

    我正在尝试从我的 AWS EC2 实例获取一些信息 我想知道是否有办法提取信息 例如 Platform Version CentOS 6 0 or 7 0 Ubuntu 10 04 or 12 04 Windows 我想知道使用 SDK 是
  • VBA Access - 在 Word 文档中查找和替换文本

    我已经在 Excel 中成功编写了一些 VBA 代码 该代码打开现有的 Word 文档 根据 Excel 工作表中的信息查找并替换字符串 由于存在的源数据来自 Access 数据库 因此我想尝试将 VBA 代码移至 Access 中并从那里
  • 在 Swift 中获取指向 C char 数组的指针

    A 有这样的结构 在 mongodb c 驱动程序的 bson h 中定义 typedef struct uint32 t domain uint32 t code char message 504 bson error t 在 Swift
  • Android 中如何在不通知的情况下更新通知?

    所以我有一个通过 MQTT 接收温度的应用程序 为了避免收到垃圾邮件通知 我希望应用程序通知一次 即振动 播放声音 然后接下来的三次 如果通知没有被忽略 它只会更新温度值 所以 Notify 更新温度 更新温度 更新温度 5 或 1 如果您
  • 数据库错误 MongoDB:数据库消失

    启动了大量的进程 然后重新启动服务器 数据库就消失了 当我走进rockmongo时 我还没有看到旧的数据库 只有一个新的数据库管理员 仅此而已 db serverStatus host host version 2 0 6 process
  • 如何更改 Spring.Net 中的配置

    IoC 容器的一个优点是您可以在对象图底部交换模拟服务 然而 这在 Spring Net 中似乎比在其他 IoC 容器中更难做到 下面是一些在 Unity 中执行此操作并具有 Spring Net 代码的代码 namespace IocSp