所以我在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;注册,所以它知道我想要做什么,但它不会为我关闭它。这里有什么我想念的吗?
答案 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实例关闭依赖关系