最优雅的解决方案来改变结构图上下文

时间:2016-12-06 06:35:21

标签: c# .net dependency-injection structuremap

我们正在做的结构图:

    internal static class ContainerBootstrapper
        {
    public static void BootstrapStructureMap()
        {
        ObjectFactory.Initialize(x =>
        {
            x.For<SafeFlowContext>().HttpContextScoped().Use<SafeFlowContext>();
            x.For<DbContext>().HttpContextScoped().Use<SafeFlowContext>();

            x.For<IInterface>().HttpContextScoped().Use<Class>();
            ...

每个应用程序只能执行一次,按照:

    public sealed class ServiceLoc
        {
            public static ServiceLoc GetInstance()
            {
                return new ServiceLoc();
            }

            private IInterfacesHere

            private ServiceLocator()
            {
                if (!_isInitialized)
                {
                    lock (_lockThis)
                    {
                        ContainerBootstrapper.BootstrapStructureMap();
                        ...

我正在编写单元测试,我知道我可以将范围从HttpContextScoped更改为Hybrid,因为这是我的问题的原因。

然而,作为一个纯粹主义者,我不想为了测试目的更改生产代码,我不想复制粘贴代码块(或整个类文件)来改变范围。

我不介意根据条件(如果它是简洁的)改变范围。

到目前为止,我一直在考虑尝试欺骗我的单元测试,将它们标记为HttpContext作用域并将bool开关添加到服务定位器,可能使用默认参数,这样当我的单元测试通过以下方式调用它时: / p>

_serviceLocator = ServiceLocator.GetInstance(bool httpcontext=false);

例如,但这似乎并不令人满意。我已经检查了结构图网站,但我看到的例子似乎不符合我的目的。

干杯!

1 个答案:

答案 0 :(得分:0)

即使它涉及更改生产代码,我最终只是简单地改变了范围方法以使用'HybridHttpOrThreadLocalScoped',因为它显然更优越。