StructureMap自动注册后代类

标签 structuremap

我有一个 Repository 的基类。在一个特定的项目中,我有这个基类的几个实现。例如

PersonRepository : Repository<T>
EmployerRepository : Repository<T>

现在,我正在 StructureMap ServiceRegistry 类中注册每个存储库。像这样:

ForRequestedType<Repository<Person>>()
  .TheDefaultIsConcreteType<PersonRepository>();
ForRequestedType<Repository<Employer>>()
  .TheDefaultIsConcreteType<EmployerRepository>();

这很糟糕,因为每次我添加存储库时,我都必须记住注册它。又迈出了一步。

有没有一种方法可以搜索 PersonRepository 所在的项目/程序集并注册从 Repository 继承的所有内容?

最佳答案

编辑:我刚刚从 project's CI server 下载了最新版本的 StructureMap 。 现在已包含您需要的内容,并且无需使用自定义约定:

public class RepositoryRegistry : Registry
{
    public RepositoryRegistry()
    {
        Scan(assemblyScanner =>
             {
                 assemblyScanner.AssemblyContainingType<PersonRepository>();
                 assemblyScanner.AddAllTypesOf(typeof (IRepository<>));
                 assemblyScanner.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
             });
    }
}

这是我最初的解决方案:

这是一个很好的起点,但可能需要改进:

public class RepositoryRegistry : Registry
{
    public RepositoryRegistry()
    {
        Scan(assemblyScanner =>
             {
                 assemblyScanner.AssemblyContainingType<PersonRepository>();
                 assemblyScanner.AddAllTypesOf(typeof (IRepository<>));
                 assemblyScanner.With<RepositoryConvention>();
             });
    }
}

public class RepositoryConvention : ITypeScanner
{
    public void Process(Type type, PluginGraph graph)
    {
        var selectedInterface =
            (from @interface in type.GetInterfaces()
            where @interface.IsGenericType &&
                  @interface.GetGenericTypeDefinition()
                      .IsAssignableFrom(typeof (IRepository<>))
            select @interface).SingleOrDefault();

        if(selectedInterface != null)
            graph.Configure(registry =>
                 registry.ForRequestedType(selectedInterface)
                    .TheDefaultIsConcreteType(type)
             );
    }
}

关于StructureMap自动注册后代类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1356021/

相关文章:

c# - StructureMap 中的 AddConcreteType 和 TheDefaultIsConcreteType 有什么区别?

c# - 当组合根位于客户端时如何在 WCF 中注入(inject)依赖项

c# - 使用具有带参数的构造函数的类初始化 StructureMap

asp.net-mvc - 未注册默认实例且无法自动确定类型

c# - 结构图错误 : No Default Instance defined for PluginFamily

dependency-injection - 将服务注入(inject) AutoMapper 目标类

c# - 如何在 StructureMap 2.6 中为插件设置 session 范围?

assemblies - StructureMap 和扫描程序集

xamarin - 无法在 Release模式下使用 StructureMap 编译 Xamarin android 项目

sqlite - NHibernate、Sqlite、丢失的表和 IOC 乐趣