StructureMap错误解决Open Generic依赖关系

时间:2011-02-28 08:51:33

标签: structuremap open-generics

所以我在StructureMap中连接了我的开放通用插件,就像这样

scan.ConnectImplementationsToTypesClosing(typeof(IRepository<>));

但仍然是可怕的

  

没有为PluginFamily定义的默认实例KharaSoft.Utils.IRepository`1 [[KharaSoft.App.Core.DomainObject,KharaSoft.App.Core,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]

我在初始化Container之后进行调试,看到它确实有一个RepositoryBase实例&lt;&gt;注册,所以它知道我想要做什么,但它不会为我关闭它。这里有什么我想念的吗?

2 个答案:

答案 0 :(得分:1)

如果没有看到完整的扫描代码或项目布局,很难锻炼。当我遇到这个问题时,我通常会遇到几个默认步骤。

确保你有

scan.WithDefaultConventions()

确保包含Repository类的程序集包含在扫描中:

x.AssemblyContainingType(typeof(UserRepository)); 

确保您具备正确的实施方案:

IRepository<User>

有匹配

Repository<User>

希望这些建议中的某些内容可以帮助您找到问题所在。

答案 1 :(得分:0)

所以我不确定这是否是“最佳”方式,但这是我发现的有效方法。我必须明确注册插件的开放实现,如下所示:

ObjectFactory.Initialize(
  x =>
    {
      x.Scan(scan =>
        {
          scan.Assembly(typeof (IRepository<>).Assembly);
          scan.WithDefaultConventions();
        });
      x.For(typeof (IRepository<>)).Use(typeof (RepositoryBase<>));
      x.For<IUnitOfWork>().Use<MyDataContext>();
    });
return ObjectFactory.Container;

请参阅我不想在所有情况下直接关闭通用。所以现在我的MVC控制器可以采取像这样的依赖

public PlayerController(IRepository<Player> players)
{
  Players = players;
}

StructureMap将使用RepositoryBase实例关闭依赖关系