我有一个通用接口<UserControl x:Class="Fallout4Checklist.Views.Partial.WeaponDetail"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Fallout4Checklist.Views.Partial">
<StackPanel>
<Border Style="{StaticResource WeaponDetailNameBorder}">
<Label Style="{StaticResource WeaponDetailName}" />
</Border>
<StackPanel Style="{StaticResource WeaponDetailContainer}">
<Border Style="{StaticResource ImageBorder}">
<Image Source="{Binding ImagePath.FullPath}" />
</Border>
<Border Style="{StaticResource ItemDescriptionBorder}">
<TextBlock Style="{StaticResource ItemDescription}" Text="{Binding Characteristics}" />
</Border>
</StackPanel>
</StackPanel>
</UserControl>
及其默认实现IDataService<T>
。然后,某些类型具有其特定的服务接口,其实现DataService<T>
,例如:
IDataService
如您所见,public interface IClientService : IDataService<Client>
{
void SomeProcess();
}
public class ClientService : DataService<Client>, IClientService
{
public override SomeDataServiceMethodOverride();
public void SomeProcess();
}
是一个专门的ClientService
,它扩展了IDataService<Client>
的功能,并实现了另一个界面。
我想要的是,当我向StructureMap询问DataService<Client>
时,它给了我一个IDataService<Client>
,但当我要求ClientService
时,它会回到默认实现{ {1}}。到目前为止,我在StructureMap配置中所拥有的是:
IDataService<OtherEntity>
但问题是,在要求DataService<OtherEntity>
时,它没有实例化Scan(
scan => {
scan.AssemblyContainingType<IClientService>();
scan.AssemblyContainingType<ClientService>();
scan.WithDefaultConventions();
});
For(typeof(IDataService<>)).Use(typeof(DataService<>));
,而是ClientService
。现在我将最后一行改为:
IDataService<Client>
但是,对于没有具体服务实现的任何实体,我必须这样做。我该如何自动完成?
答案 0 :(得分:1)
从您的描述中,您可能希望在具体服务类型上注册所有接口。 StructureMap通过提供定义应用于扫描操作的自定义约定来实现此功能。您定义了一个实现static char tmp[100];
^^^^^^
strncpy( tmp, string, 100 );
tmp[99] = '\0';
^^^^^^^^^^^^^^^
的类型,然后定义StructureMap.Graph.IRegistrationConvention
方法。该方法提供扫描类型的集合以及存储自定义配置的注册表。
以下代码段在功能上等同于StructureMap文档found here中的代码。
ScanTypes
然后,您可以更新扫描操作以应用此约定。
public class AllInterfacesConvention : StructureMap.Graph.IRegistrationConvention
{
public void ScanTypes(TypeSet types, Registry registry)
{
foreach(Type type in types.FindTypes(TypeClassification.Concretes | TypeClassification.Closed)
{
foreach(Type interfaceType in type.GetInterfaces())
{
registry.For(interfaceType).Use(type);
}
}
}
}