我有一个类似这样的界面:
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。 我不想指定所有特定的视图模型,所以无论如何我可以让这个扫描工作吗?
答案 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清楚地表明,开放的通用类型注册和特定的封闭通用类型注册应该有效。你能用这种模式来处理你的类型吗?