如何在与 Castle Windsor DI 容器相同的上下文中重用瞬态依赖项

2024-03-21

如果我有以下设置,当在同一上下文中创建对象时,如何将容器配置为使用相同的数据库

public class Database { }
public interface IRepository { Database Database { get; } }
public interface IFooRepository : IRepository { }
public interface IBarRepository : IRepository { }

public class FooRepository : IFooRepository
{
    public Database Database { get; private set; }
    public FooRepository(Database database) { this.Database = database; }
}

public class BarRepository : IBarRepository
{
    public Database Database { get; private set; }
    public BarRepository(Database database) { this.Database = database; }
}

public class Consumer
{
    public IFooRepository fooRepository { get; private set; }
    public IBarRepository barRepository { get; private set; }
    public Consumer(IFooRepository fooRepository, IBarRepository barRepository)
    {
        this.fooRepository = fooRepository;
        this.barRepository = barRepository;
    }
}

[TestClass]
public class ConfigurationTest
{
    private IWindsorContainer container;

    [TestMethod]
    public void SameDatabaseIsUsed()
    {
        Consumer consumer = container.Resolve<Consumer>();
        IFooRepository fooRepository = consumer.fooRepository;
        IBarRepository barRepository = consumer.barRepository;
        Assert.AreEqual(fooRepository.Database, barRepository.Database); //FAILS
    }

    [TestMethod]
    public void DifferentDatabaseIsUsed()
    {
        Consumer consumer = container.Resolve<Consumer>();
        IFooRepository fooRepository = consumer.fooRepository;
        Consumer consumer2 = container.Resolve<Consumer>();
        IBarRepository barRepository = consumer2.barRepository;
        Assert.AreNotEqual(fooRepository.Database, barRepository.Database); //PASSES
    }

    [TestInitialize]
    public void SetUp()
    {
        container = new WindsorContainer();
        container.Register(
            Component.For<Database>().ImplementedBy<Database>().LifeStyle.Transient,
            AllTypes.FromThisAssembly()
                    .BasedOn<IRepository>().WithService.FromInterface()
                    .Configure(c => c.LifeStyle.Transient),
            Component.For<Consumer>().ImplementedBy<Consumer>().LifeStyle.Transient
                    );

    }
}

编辑: 我尝试过使用自定义生活方式,但我不知道可以用什么来检测我已经切换了上下文

public class DatabaseLifestyleManager : AbstractLifestyleManager
{
    private CreationContext context;
    private Database database;

    private Database Database
    {
        get
        {
            if (database == null) database = new Database();
            return database;
        }
        set 
        {
            database = null;
        }
    }

    public override object Resolve(CreationContext context)
    {
        if (this.context!=null && this.context.??? == context.???)
            return Database;
        else
        {
            this.context = context;
            Database = null;
            return Database;
        }

    }

    public override void Dispose()
    {
        database = null;
        context = null;
    }
}
......
Component.For<Database>().ImplementedBy<Database>().LifeStyle.Custom(typeof(DatabaseLifestyleManager)

请求瞬态组件时,您总是会得到一个新实例,如果这不是您想要的,请不要使用瞬态生活方式:-)

为什么要注册一个瞬态组件,但尝试根据某种“上下文”解析相同的对象?最有可能的是,这种生活方式不适合当前的情况,如果你试图强迫它变成不适合的东西,你就会遇到麻烦。

你想要的是一种情境生活方式,如本文 http://blingcode.blogspot.com/2010/05/contextual-lifestyle-with-castle.html。 以下两个要点对此有一个实现:

  • http://gist.github.com/400979 http://gist.github.com/400979
  • http://gist.github.com/400980 http://gist.github.com/400980

这将允许您执行以下操作:

Register(Component.For<Database>().LifeStyle.Scoped())

[TestMethod]
public void SameDatabaseIsUsed()
{
    using (container.BeginScope())
    {
        Consumer consumer = container.Resolve<Consumer>();
        IFooRepository fooRepository = consumer.fooRepository;
        IBarRepository barRepository = consumer.barRepository;
        Assert.AreEqual(fooRepository.Database, barRepository.Database); // YAY!
    }
}

希望这可以帮助!

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

如何在与 Castle Windsor DI 容器相同的上下文中重用瞬态依赖项 的相关文章

随机推荐

  • 使用 DT(DataTables 按钮扩展)导出表格时保持格式

    我制作了一个闪亮的应用程序 有人上传文件 计算一些比率 并且可以使用阈值滑块来格式化这些比率 我用DT formatStyle为此 它工作得非常好 据我了解这个函数 它创建一个回调来处理条件格式 然后 我想使用按钮扩展导出数据DT 我想在导
  • 正则表达式在 if 语句中将字符串与空格匹配(使用引号?)

    我将如何进行如下所示的正则表达式匹配 但在 This 周围加上引号 就像在现实世界中 This 将是一个可以在其中包含空格的字符串 bin bash text This is just a test string if text This
  • 分布式事务:.NET Framework 与 .NET Core

    我有以下代码示例 static void Main string args TransactionManager DistributedTransactionStarted sender eventArgs gt Console Write
  • SSE 和 AVX MoveMask 的用途是什么

    问题 MoveMask 的目的或意图是什么 学习如何使用 x86 x86 64 汇编 SSE AVX 的最佳地点是哪里 我可以更有效地编写代码吗 提问原因 我有一个用 F for NET 编写的使用 SSE2 的函数 我使用 AVX2 写了
  • 仅检索 Java 类中声明的静态字段

    我有以下课程 public class Test public static int a 0 public int b 1 是否可以使用反射来仅获取静态字段的列表 我知道我可以获得所有字段的数组Test class getDeclaredF
  • Android Google 地图 v2 删除默认标记

    我在我的 Android 应用程序中实现了 Android Google Maps v2 没有任何问题 但是 地图包含一些我未包含的 默认标记 我的意思是 一些私人营业地点 是否可以从地图上删除这些标记 以便我只获得城市名称和街道名称 只需
  • 捕获 Camera2 预览帧返回空缓冲区

    我一直在开发一个简单的 Android 应用程序 旨在将流式相机帧从 Android Camera2 API 管道传递到我的算法 我已经制作了几个应用程序 忠实地使用 Android Camera1 API 执行此操作 但即使在检查 Goo
  • 设置证书验证位置时出错

    OS Ubuntu 16 01 PHP 7 0 根据一些谷歌搜索以及 StackOverflow 上问题的输入 我设置以下 Curl 选项 CURLOPT SSL VERIFYPEER gt true CURLOPT SSL VERIFYH
  • 在emacs中使用flymake和tramp远程运行pyflakes?

    我正在尝试使用 Flymake 来运行 pyflakes 如建议的那样here http www emacswiki org cgi bin wiki PythonMode toc9 这对于本地文件来说效果很好 并且几乎可以通过一些调整来处
  • Bootstrap网格系统-如何使两列高度相等? [复制]

    这个问题在这里已经有答案了 如何在 Bootstrap 网格列中使两列具有相同的高度 item text padding 30px important Flex center display flex align items center
  • 获取文件的扩展名而不在路径中提供扩展名

    当您指定除扩展名之外的整个路径时 是否可以获得文件的扩展名 例如 C Users Administrator Pictures BlueHillsTest Thanks Directory GetFiles http msdn micros
  • Selenium 2 和 JUnit4:如何捕获异常屏幕截图?

    我只想在意外异常时捕获屏幕截图 Note This answer could be outdated The answer is based on Selenium 2 15 Using 测试观察者 http kentbeck github
  • 正则表达式匹配所有字母数字和某些特殊字符?

    我正在尝试让正则表达式工作 该正则表达式将允许所有字母数字字符 大写字母和非大写字母以及数字 但也允许空格 正斜杠 破折号 并加上 我已经开始了 但到目前为止还没有成功 如果你想允许only那些 你还需要使用锚点 and a zA Z0 9
  • 了解libuv/epoll/非阻塞网络IO

    我试图了解非阻塞网络 IO 是如何工作的Node js libuv 我已经发现了fileIO 是使用完成的libuv工作线程 因此 在后台线程中 不过很多地方都说networkIO 是使用系统调用以非阻塞方式完成的 例如epoll kque
  • 使用 Delphi 通过 LDAP 进行 Active Directory 身份验证,并使用 [email protected]

    正如您从下面的代码片段中看到的 我目前正在使用 adshlp 和 ActiveDs TLB 从当前登录的用户收集有关 AD 的信息 我有一个表格 允许用户输入他们的 AD 密码 并在允许访问系统之前验证其是否正确 这很好 我现在遇到的问题是
  • 相当于 WinRT 中的可编辑组合框?

    标准 桌面 Windows 组合框具有三种样式 简单 下拉和下拉列表 下拉菜单的工作方式类似于编辑控件和组合框 而下拉列表不允许编辑 我是否遗漏了某些内容 或者 Windows 8 商店应用程序中的 XAML ComboBox 控件仅支持下
  • Cypress 通过 console.log 和命令日志来输出

    是否可以重定向或捕获赛普拉斯浏览器日志和命令日志以输出 我读了一些 Cypress githubissues https github com cypress io cypress issues 448关于这个话题 但我不知道如何让它发挥作
  • 替换宏变量中的字符串?

    我有一个宏 我在其中传递一个参数并使用它根据输入的名称定义一个新变量 define DO X x char do x var x other things 问题是如果我传入一个结构变量 它就会崩溃 DO X some struct gt t
  • 如何从 cdn THREE.js 加载 GLTFLoader

    我在弄清楚如何让 GLTFLoader 在 THREE js 中工作时遇到一些问题 我不明白如何使用 CDN 站点来托管文件 我尝试过使用网络上示例的链接 但这并没有完成我的工作 我在另一篇文章中读到 GLTFLoader 文件必须与我正在
  • 如何在与 Castle Windsor DI 容器相同的上下文中重用瞬态依赖项

    如果我有以下设置 当在同一上下文中创建对象时 如何将容器配置为使用相同的数据库 public class Database public interface IRepository Database Database get public