在using语句中使用条件逻辑是否可以

时间:2015-01-29 15:48:57

标签: c# .net dependency-injection

好的,所以我想说我需要处理订单。我们过去总是只有一种订单,订单。由于奇怪的情况,我们必须制作我们自己的注射器,并且目前正在使用它:

using(DependencyInjector.Inject()
    .ForType<Order>()
    .ImplementedBy<InsideOrderProcessor>())
{ ... };

现在我们有了新的订单类型或订单,这需要在处理方面有细微差别。但它仍然是Order类型,不能是其他任何东西。可以这样做:

using( isInsideOrder
    ? DependencyInjector.Inject()
        .ForType<Order>()
        .ImplementedyBy<InsideOrderProcessor>()
    : DependencyInjector.Inject()
        .ForType<Order>()
        .ImplementedBy<OutisdeOrderProcessor>()) 
{ ... };

这甚至会起作用吗?如果是这样,可以吗?

2 个答案:

答案 0 :(得分:6)

在代码编译的意义上它是好的,但它不是特别易读。为了编写易于维护的代码,我建议将其重构为一个单独的方法。它应该看起来像这样:

IOrderProcessor GetOrderProcessor(bool isInsideOrder) 
{
    if (isInsideOrder)
    {
        return DependencyInjector.Inject()
            .ForType<Order>()
            .ImplementedyBy<InsideOrderProcessor>();
    }
    else
    {
        return DependencyInjector.Inject()
            .ForType<Order>()
            .ImplementedBy<OutisdeOrderProcessor>();
    }
}

然后你可以这样写using

using(this.GetOrderProcessor(isInsideOrder))
{
    ...
}

答案 1 :(得分:0)

在使用块之外创建对象(通过您喜欢的任何方式),然后在using块中使用它是可以接受的。换句话说,它不需要在使用块内实例化以在使用块中使用它。