C# 在运行时从StructureMap中删除默认实例类型

C# 在运行时从StructureMap中删除默认实例类型,c#,dependency-injection,structuremap,ioc-container,C#,Dependency Injection,Structuremap,Ioc Container,是否可以在运行时删除映射?我可以很容易地添加一个: ObjectFactory.Configure(ce => ce.ForRequestedType<IDateAdjuster>(). TheDefaultIsConcreteType<DateAdjusterForTest>()); 但这不起作用 界面所做的是隐藏日期时间。现在和日期时间。今天属性,以便在测试期间,特别是集成和用户验收期间,系统可以配置为按其所见移动当前日期

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

ObjectFactory.Configure(ce => 
       ce.ForRequestedType<IDateAdjuster>().
           TheDefaultIsConcreteType<DateAdjusterForTest>());
但这不起作用

界面所做的是隐藏
日期时间。现在
日期时间。今天
属性,以便在测试期间,特别是集成和用户验收期间,系统可以配置为按其所见移动当前日期和时间

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

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

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


因为只有接口的实现才会改变,所以我只需在客户端管理员设置它时切换要使用的实现,然后在完成时重置它。在运行时更改IoC配置有点可怕。也许使用工厂将是更干净的解决方案。例如:

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

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

在运行时更改IoC配置有点可怕。使用工厂可能是更干净的解决方案。例如:

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

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

因此,如果开关由用户更改的内容控制,我猜它在数据库中还是在会话中?如果是这种情况,您可以使用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>();
  });
});
var容器=新容器(x=>
{         
x、 InstanceOf()是有条件的(o=>
{                 
o、 If(c=>c.GetInstance()
.UseTestDateRegulator),然后它是.OfConcreteType();
o、 默认值是混凝土类型的();
});
});
IUserSettings可以是在您的容器中注册的任何内容,这些内容将告诉您用户是否在管理部分设置了日期和时间


有关更多详细信息,请参阅本博客:

因此,如果开关由用户更改的内容控制,我猜它是在数据库中还是在会话中?如果是这种情况,您可以使用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>();
  });
});
var容器=新容器(x=>
{         
x、 InstanceOf()是有条件的(o=>
{                 
o、 If(c=>c.GetInstance()
.UseTestDateRegulator),然后它是.OfConcreteType();
o、 默认值是混凝土类型的();
});
});
IUserSettings可以是在您的容器中注册的任何内容,这些内容将告诉您用户是否在管理部分设置了日期和时间


有关更多详细信息,请参阅本博客:

为什么运行时的IOC配置很可怕?我只是想告诉国际奥委会,系统已经进入一种状态,我现在想使用接口的实现。在这个阶段,我认为我将有一个空的实现作为默认值,并在这两个实现之间进行切换。在组合根目录中设置容器后,更改容器的配置会使配置更加复杂,并且会导致更多的错误。您可能需要为此类代码编写单元测试。我很难看出你们想解决什么问题,但我认为你们不需要复杂的结构。也许您可以用实际应用程序代码的信息更新您的问题。为什么运行时的IOC配置很可怕?我只是想告诉国际奥委会,系统已经进入一种状态,我现在想使用接口的实现。在这个阶段,我认为我将有一个空的实现作为默认值,并在这两个实现之间进行切换。在组合根目录中设置容器后,更改容器的配置会使配置更加复杂,并且会导致更多的错误。您可能需要为此类代码编写单元测试。我很难看出你们想解决什么问题,但我认为你们不需要复杂的结构。也许你可以用实际应用程序代码的信息来更新你的问题。这可能行得通,不幸的是,这个例子不太清楚。主要的问题是,构造函数不知道它需要哪个实例,所以我不确定如何构建IFI。如果你用一个逻辑示例来编辑你的问题,我可以尝试建议它如何适合这个语法。编辑了问题,有关于条件构造的提示吗?或者你需要更多的信息吗?希望我修改后的答案有意义,如果你需要我澄清任何事情,请告诉我。这可能有用,不幸的是,这个例子不太清楚。主要的问题是,构造函数不知道它需要哪个实例,所以我不确定如何构建IFI。如果你用一个逻辑示例来编辑你的问题,我可以尝试建议它如何适合这个语法。编辑了问题,有关于条件构造的提示吗?或者你需要更多的信息吗?希望我修改后的答案有意义,如果你需要,请告诉我