C# 如何在Structuremap中使用自动注册和类型扫描
在我的解决方案中,我有三个这样的项目。 我将Common.dll和Service.dll复制到像d:\libs这样的文件夹中,并使用下面的代码进行类型扫描C# 如何在Structuremap中使用自动注册和类型扫描,c#,structuremap,structuremap3,C#,Structuremap,Structuremap3,在我的解决方案中,我有三个这样的项目。 我将Common.dll和Service.dll复制到像d:\libs这样的文件夹中,并使用下面的代码进行类型扫描 ObjectFactory.Initialize(x => { x.Scan(xx => { xx.AssembliesFromPath(@"d:\libs"); xx.L
ObjectFactory.Initialize(x =>
{
x.Scan(xx =>
{
xx.AssembliesFromPath(@"d:\libs");
xx.LookForRegistries();
});
});
//I have PersonService that implement IPersonService
namespace Common
{
public interface IPersonService
{
string SayHello(string name);
}
}
namespace Services
{
public class PersonService : IPersonService
{
public string SayHello(string name)
{
return string.Format("Hello {0}", name);
}
}
}
在初始化依赖项之后,当我想从IPerson获取实例时,我得到了这个错误
var personService = ObjectFactory.GetInstance<IPersonService>();
var personService=ObjectFactory.GetInstance();
{“未注册任何默认实例,并且无法自动确定“Common.IPersonService”类型的默认实例\r\n\r\n没有为Common.IPersonService\r\n\r\n1.)Container.GetInstance(Common.IPersonService)\r\n”}
- 添加
xx.WithDefaultConventions()代码>也是
- 当您使用StructureMap设计插件系统时,宿主项目不应该引用任何插件。只应引用接口/契约插件,并且不应将此程序集复制到
文件夹。换句话说,当前应用程序域不应该有任何程序集的2个实例。因此,如果要在宿主程序中直接使用d:\libs
接口,请添加对IPersonService
的引用,不要将其复制到Common.dll
文件夹中以避免重复。现在宿主项目不应该也引用d:\libs
Services.dll
Scan
时使用WithDefaultConventions()
,这将在内部使用DefaultConventionScanner
您可以阅读源代码或查看文档,但它可以做到这一点:
var interfaceName = "I" + concreteType.Name;
return concreteType.GetInterfaces().FirstOrDefault(t => t.Name == interfaceName);
在默认约定扫描期间,扫描的每个具体类型都将查找前面带有字母“I”的类名的第一个接口。因此,在扫描过程中,如果在扫描过程中发现FooService
,则会自动注册并分配带有的IFooService
,因此您无需明确说明
For()。使用()
当您请求的类型没有注册的具体实现时,您看到的异常将始终被抛出。您希望注册的类型不是因为您正在使用xx.LookForRegistries()进行扫描,它查找StructureMap注册表(您可以在此处阅读有关注册表的更多信息-)。如果您使用正确的注册创建这样的注册,SM将找到它们并注册
如前所述,AltreNative将使用xx.WithDefaultConventions()。在使用默认约定时查看此边缘情况,预期类型未注册-I add xx.WithDefaultConventions();并删除对services.dll的引用…但我得到了erorr。我的扫描代码必须更改吗?否。也从
d:\libs
文件夹中删除Common.dll
文件。