【问题标题】:Removing a default instance type from StructureMap at runtime在运行时从 StructureMap 中删除默认实例类型
【发布时间】:2011-01-10 10:47:12
【问题描述】:

是否可以在运行时删除映射?我可以很容易地添加一个:

ObjectFactory.Configure(ce => 
       ce.ForRequestedType<IDateAdjuster>().
           TheDefaultIsConcreteType<DateAdjusterForTest>());

我可以检查是否存在映射

ObjectFactory.Model.HasDefaultImplementationFor<IDateAdjuster>()

但我似乎无法删除默认实例类型。我试过这个

var config = ObjectFactory.Model.PluginTypes
           .FirstOrDefault(pt => pt.PluginType == typeof(IDateAdjuster));
if (config != null) {config.Default = null;}

但这不起作用。

界面的作用是隐藏DateTime.NowDateTime.Today 属性,以便在测试期间,特别是集成和用户接受期间,系统可以配置为根据它看到的改变当前日期和时间。

我想做的是检查接口是否有默认实现,如果有,我会创建并调用它,如果没有,我就使用DateTime.NowDateTime.Today


似乎我无法告诉结构映射删除默认类型,所以我现在添加了一个新的接口默认实现并将接口扩展为具有一个属性来指示它是否处于活动状态。默认实现表示接口未激活。所以现在我总能得到一个实例,然后检查我是否想使用它。

系统有很多特定于日期和时间的行为,因此客户端需要能够测试系统在不同日期和时间的行为。他们登录到管理部分,然后将日期和时间设置为适当的值,然后我将默认实现切换到进行适当调整的测试实现。

因为只有接口的实现会发生变化,所以我只是在客户端管理员设置它时切换我想要使用的实现,然后在它们完成后重置它

【问题讨论】:

    标签: c# dependency-injection structuremap ioc-container


    【解决方案1】:

    在运行时更改 IoC 配置有点吓人 IMO。也许使用工厂会是更清洁的解决方案。例如:

    public interface IOptionalFactory
    {
        IOptional GetInstance(IPrinciple currentUser);
    }
    

    您可以注入IOptionalFactory 而不是IOptional 接口,并让工厂根据提供的用户信息返回不同的实例。

    【讨论】:

    • 为什么运行时的 IOC 配置很可怕?我真的只是想告诉 IOC 系统已经进入我现在想要使用接口实现的状态。在这个阶段,我认为我将使用 null 实现作为默认实现并在两者之间切换
    • 在组合根目录中设置容器后更改容器的配置会使配置变得更加复杂,并且会出现更多错误。您可能需要为此类代码编写单元测试。我很难看出你要解决什么问题,但我认为你不需要一些复杂的结构。也许您可以使用有关实际应用程序代码的信息来更新您的问题。
    【解决方案2】:

    所以如果开关是由用户更改的东西控制的,我猜它是在数据库中还是在会话中?如果是这种情况,您可以使用 StructureMap 的条件构造功能来执行此操作:

    var container = new Container(x =>
    {         
      x.InstanceOf<IDateAdjuster>().Is.Conditional(o =>
      {                 
        o.If(c => c.GetInstance<IUserSettings>()
         .UseTestDateAdjuster).ThenIt.Is.OfConcreteType<DateAdjusterForTest>();
    
        o.TheDefault.Is.OfConcreteType<DateAdjuster>();
      });
    });
    

    IUserSettings 可以是在您的容器中注册的任何内容,它会告诉您用户是否在管理部分设置了日期和时间。

    查看此博客了解更多详情:http://codebetter.com/jeremymiller/2009/01/19/conditional-object-construction-in-structuremap-i-e-fun-with-lambdas/

    【讨论】:

    • 这可能有效,不幸的是这个例子不是很清楚。主要问题是构造函数不知道它需要哪个实例,所以我不确定如何构建 If
    • 如果你用一个你将用来做出决定的逻辑示例来编辑你的问题,我可以尝试建议它如何适应这种语法。
    • 编辑了问题,关于条件构造的任何提示?还是您需要更多信息?
    • 希望我修改后的答案有意义,如果您需要我澄清任何事情,请告诉我。
    猜你喜欢
    • 2013-05-23
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多