0

所以我已经像这样在 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]

我在容器初始化后进行调试,发现它确实注册了一个 RepositoryBase<> 的实例,所以它知道我想要做什么,但它不会为我关闭它。我在这里缺少什么吗?

4

2 回答 2

1

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

确保你有

scan.WithDefaultConventions()

确保包含存储库类的程序集包含在扫描中:

x.AssemblyContainingType(typeof(UserRepository)); 

确保您有正确的实现:

IRepository<User>

有匹配的

Repository<User>

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

于 2011-02-28T09:34:35.307 回答
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 的实例关闭依赖项

于 2011-02-28T23:15:31.803 回答