StructureMap - 扫描 - 具有基本实现和特定的通用接口

时间:2010-04-12 08:16:11

标签: c# structuremap

我有一个类似这样的界面:

interface IGenericSetupViewModel<T>

然后我有一个默认的实现,类似这样

class GenericSetupViewModel<T> : IGenericSetupViewModel<T>

对于某些特定的类,我有一个特定的实现:

class ContractSetupViewModel : GenericSetupViewModel<Contract>

现在我想在要求

时让StructureMap返回正确的实例
ObjectFactory.GetInstance<GenericSetupViewModel<Contract>();

我想让ContractSetupViewModel返回,当要求其他任何东西时,我 想得到一个

的实例
GenericSetupViewModel<T>

我试过这样做:

        StructureMap.ObjectFactory.Configure(x =>
        {
            x.Scan(y =>
            {
                y.TheCallingAssembly();
                y.AddAllTypesOf(typeof(IGenericSetupViewModel<>));
                y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel<>));
            });
        });

然而,这导致我总是获得GenericSetupViewModel而不是ContractSetupViewModel。 我不想指定所有特定的视图模型,所以无论如何我可以让这个扫描工作吗?

3 个答案:

答案 0 :(得分:3)

如果您的特定结束类型没有直接实现接口,那么StructureMap中存在一个短暂的错误,其中ConnectImplementationToTypesClosing有问题。 获得最新版本的StructureMap后,以下代码将起作用:

StructureMap.ObjectFactory.Configure(x =>
{
    x.Scan(y =>
    {
        y.TheCallingAssembly();
        y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel<>));
    });
    x.For(typeof (IGenericSetupViewModel<>)).Use(typeof(GenericSetupViewModel<>));
});

答案 1 :(得分:0)

GetInstance方法中,您应该执行以下操作:

if (AnInstance is GenericSetupViewModel)
    return AnInstance as GenericSetupViewModel;
else if (AnInstance is ContractSetupViewModel)
    return AnInstance as ContractSetupViewModel;

答案 2 :(得分:0)

我对StructureMap不太熟悉,但可能是你被注册优先级欺骗了吗?

由于您先调用y.AddAllTypesOf(typeof(IGenericSetupViewModel<>));,因此首先会注册opene泛型类GenericSetupViewModel<T>。此注册将满足您对GenericSetupViewModel<Contract>的解决请求,并且会忽略更具体的ContractSetupViewModel注册。

尽管如此,the Flattener sample清楚地表明,开放的通用类型注册和特定的封闭通用类型注册应该有效。你能用这种模式来处理你的类型吗?