C# 如何在Structuremap中使用自动注册和类型扫描

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

在我的解决方案中,我有三个这样的项目。

我将Common.dll和Service.dll复制到像d:\libs这样的文件夹中,并使用下面的代码进行类型扫描

 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设计插件系统时,宿主项目不应该引用任何插件。只应引用接口/契约插件,并且不应将此程序集复制到
    d:\libs
    文件夹。换句话说,当前应用程序域不应该有任何程序集的2个实例。因此,如果要在宿主程序中直接使用
    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
文件。