我有一个大型 Windows 窗体应用程序,其中包含最终用户可以使用的大量报告/工作流。我正在为 IoC/DI、.Net 3.5 使用 StructureMap
这些报告/路线中的每一个的元数据由数据库中的行表示。标准的东西,比如唯一的 rowID、报告名称、几个描述性的句子。
目前我有一个班级负责启动每个报告。这是一个庞大的 Case 语句,如下所示:
Public Sub LaunchSomething(launchRequest as LaunchItemInfo)
  Dim cmd as ICommand
  Select Case launchRequest.UniqueId
  Case 1
    cmd = New Reports.AccountsPayable.PrintChecksCommand
  Case 2
    cmd = New SomeOtherCommandClass
  ..
  Case 400
    cmd = New Report400Class
  End Select
    AppController.Commands.Invoke(cmd)
  End Sub
我真的希望能够使用这样的代码:
Public Sub LaunchSomething(launchRequest as LaunchItemInfo)
  Dim cmd as ICommand
  Dim typ as Type
  typ = Type.GetType(launchRequest.ReportClassName, launchRequest.FileContainingReportClass)
  cmd = Activator.CreateInstance(typ)
  AppController.Commands.Invoke(cmd)
End Sub
这些是我正在使用的支持接口和类。ICommand 只是一个标记接口
Public Interface ICommand
End Interface
Public Interface ICommandHandler(Of C As ICommand)
    Sub Handle(cmd As C)
End Interface
Public Class PrintChecksCommand
    Implements ICommand
End Class
AppController.Commands 是一个 CommandInvoker,Invoke 方法如下所示:
Public Sub Invoke(Of C As ICommand)(ByVal command As C)
  Dim handlers as Generic.IList(Of IcommandHandler(Of C))
  handlers = ObjectFactory.GetAllInstances(Of ICommandHandler(Of C))()
  For each h as ICommandHandler(Of C) in handlers
    h.Handle(command)
 Next
 End Sub
当我将原始代码与 400 多个 Case 语句一起使用时,处理程序集合正确地包含 1 个项目。所以我知道我的结构映射注册表设置正确。
当我尝试使用所需的代码时Activator.CreateInstance,处理程序集合为空。  
据我在调试器中可以看出,当使用这两种方法中的任何一种来ICommand创建CommandInvokerPrintChecksCommand
我需要更改什么才能在Activator.CreateInstance(typ)此处使用?