如果不存在特定的,StructureMap加载默认的通用实现

时间:2016-01-21 15:05:55

标签: c# dependency-injection structuremap

我有一个通用接口<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>

但是,对于没有具体服务实现的任何实体,我必须这样做。我该如何自动完成?

1 个答案:

答案 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);
            }
        }
    }
}