C# 如何让T4基于特定命名空间中的类(递归)生成代码

C# 如何让T4基于特定命名空间中的类(递归)生成代码,c#,namespaces,t4,C#,Namespaces,T4,我的体系结构的服务层由许多单一用途的命令类(对数据执行一个特定功能的类,如创建用户)和查询类(针对特定数据查询数据库的单个类)组成。这些通过Windsor安装程序注入到我的Asp.net MVC控制器类中 例如,我运行container.Register(Component.For().ImplementedBy())在我的自定义IWindsorInstaller类中,在我的控制器中实例化CreateUserCommand 问题是,由于每个命令/查询类都是单一用途的,因此我最终会得到很多这样的类

我的体系结构的服务层由许多单一用途的命令类(对数据执行一个特定功能的类,如创建用户)和查询类(针对特定数据查询数据库的单个类)组成。这些通过Windsor安装程序注入到我的Asp.net MVC控制器类中

例如,我运行
container.Register(Component.For().ImplementedBy())在我的自定义
IWindsorInstaller
类中,在我的控制器中实例化
CreateUserCommand

问题是,由于每个命令/查询类都是单一用途的,因此我最终会得到很多这样的类,而维护我的安装程序类将是一件痛苦的事情。我突然想到,这对于T4来说是一个完美的工作,因为我可以运行T4并让它重新生成installer类,以自动注册我的所有命令和查询类

不幸的是,因为我以前从未做过T4,所以我不知道如何继续实际实施。我已经阅读了T4的基础知识,但我的主要困惑点是如何通过T4实际查找所有命令和查询类

在纸上,我可以找到我所有的命令/查询类,因为它们是在
MyApp.DomainModel.Commands.*
MyApp.DomainModel.querys.*
名称空间中定义的。例如,
CreateUserCommand
类驻留在
MyApp.DomainModel.querys.Users
命名空间中。然而,我不知道如何在运行时实际查看名称空间,更不用说递归了

我可以为这些类创建一个
ICommand
IQuery
接口,如果在T4中比在名称空间中更容易找到,那么这些类就可以基于它,但我不知道如何通过T4找到所有
ICommand/IQuery
子类

我确实知道反射,但从阅读中我已经读到很多关于在T4中使用反射是个坏主意和/或不能正常工作的说法


如果有人能为我指出任何能帮助我实现这一目标的东西,我将不胜感激

使用来自T4的反射本身并不是一件坏事,但关于“工作不正常”,主要问题是您无法可靠地反映定义了T4模板的当前程序集,因为尚未编译该程序集。为了从T4中访问自己的类型,通常需要将项目拆分为不同的程序集

查找命名空间中的所有类型不是一个困难的问题,特别是当它们都在同一个程序集中定义时

<#@ import namespace = "System.Reflection" #>
<# 
var path="D:\Path\To\MyApp.DomainModel.dll";
Assembly a = Assembly.ReflectionOnlyLoadFrom(path);
foreach (var type in a.GetTypes()) {
    if (type.Namespace == "MyApp.DomainModel.Commands") { #>
        <#=type.Name #>
<#  }
} 
#>