单元测试项目中的 StructureMap 注册表:未注册默认实例
StructureMap Registries in Unit Test Projects: No default Instance is registered
使用 StructureMap...
我在 BUSINESS 层中有一系列程序集和一个 IoC 入口点,我在其中定义我的 ContainerRegistry
如下:
BUSINESS.DLL 注册表:
WorkflowProvider class 位于它自己的库中。因此,我将 BUSINESS LAYERS 程序集传递到 WorkflowProvider 中,因此它可以 "find" 某些(预期的)class 动态地在 BUSINESS LAYER 中。
// I have simplified this class for the question
public ContainerRegistry()
{
Scan(
scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.LookForRegistries();
scan.AssembliesFromApplicationBaseDirectory(f => f.FullName.StartsWith("My.Awesome.Application", true, null));
scan.AddAllTypesOf(typeof(IWorkflowProvider));
scan.SingleImplementationsOfInterface();
});
For<IWorkflowProvider>().Use<WorkflowProvider>()
.Ctor<Assembly>().Is(Assembly.GetExecutingAssembly());
}
例外情况:
现在,我想为所有程序集编写一组单元测试——包括 BUSINESS & WORKFLOW 程序集。但是,当我尝试创建 WorkflowProvider 的实例时,出现以下异常:
var container = IoC.Initialize();
var workflowProvider = container.GetInstance<WorkflowProvider>()
No default Instance is registered and cannot be automatically
determined for type 'System.Reflection.Assembly'
目标:
此外,当我使用单元测试项目中的业务层 ContainerRegistry
时,我想在这部分映射中替换单元测试程序集:
For<IWorkflowProvider>().Use<WorkflowProvider>()<br/>
.Ctor<Assembly>().Is(Assembly.GetExecutingAssembly());
问题:
- 单元测试项目是否也需要它自己的注册表?
- 如果是这样,它看起来像什么?
- 如果是这样,我如何在 1 个项目中使用 2 个注册表?
- 如何替换 GetExecutingAssembly 部分?
- 这里正确的方法是什么?
希望我解释得对。
谢谢
这是我找到的唯一解决方案。我希望其他人能提出更好的解决方案。
var args = new ExplicitArguments();
args.Set<Assembly>(Assembly.GetExecutingAssembly());
var container = IoC.Initialize();
var workflowProvider = container.GetInstance<WorkflowProvider>(args);
使用 StructureMap...
我在 BUSINESS 层中有一系列程序集和一个 IoC 入口点,我在其中定义我的 ContainerRegistry
如下:
BUSINESS.DLL 注册表:
WorkflowProvider class 位于它自己的库中。因此,我将 BUSINESS LAYERS 程序集传递到 WorkflowProvider 中,因此它可以 "find" 某些(预期的)class 动态地在 BUSINESS LAYER 中。
// I have simplified this class for the question
public ContainerRegistry()
{
Scan(
scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.LookForRegistries();
scan.AssembliesFromApplicationBaseDirectory(f => f.FullName.StartsWith("My.Awesome.Application", true, null));
scan.AddAllTypesOf(typeof(IWorkflowProvider));
scan.SingleImplementationsOfInterface();
});
For<IWorkflowProvider>().Use<WorkflowProvider>()
.Ctor<Assembly>().Is(Assembly.GetExecutingAssembly());
}
例外情况:
现在,我想为所有程序集编写一组单元测试——包括 BUSINESS & WORKFLOW 程序集。但是,当我尝试创建 WorkflowProvider 的实例时,出现以下异常:
var container = IoC.Initialize();
var workflowProvider = container.GetInstance<WorkflowProvider>()
No default Instance is registered and cannot be automatically determined for type 'System.Reflection.Assembly'
目标:
此外,当我使用单元测试项目中的业务层 ContainerRegistry
时,我想在这部分映射中替换单元测试程序集:
For<IWorkflowProvider>().Use<WorkflowProvider>()<br/>
.Ctor<Assembly>().Is(Assembly.GetExecutingAssembly());
问题:
- 单元测试项目是否也需要它自己的注册表?
- 如果是这样,它看起来像什么?
- 如果是这样,我如何在 1 个项目中使用 2 个注册表?
- 如何替换 GetExecutingAssembly 部分?
- 这里正确的方法是什么?
希望我解释得对。
谢谢
这是我找到的唯一解决方案。我希望其他人能提出更好的解决方案。
var args = new ExplicitArguments();
args.Set<Assembly>(Assembly.GetExecutingAssembly());
var container = IoC.Initialize();
var workflowProvider = container.GetInstance<WorkflowProvider>(args);