我遇到了同样的问题:
有一个通用存储库:
public interface IRepository<TEntity> : IDisposable where TEntity : class
{ }
和一个具体的实现:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{ }
我想在运行时将其注入到控制器的构造函数中,其中 TEntity 将是与该控制器相关的模型:
public FooBarController(IRepository<FOO_BAR_TYPE> repository)
{
_repo = repository;
}
然后控制器将使用存储库“_repo”来更新模型:
//
// POST: /EmergencyServiceType/Create
[HttpPost]
public ActionResult Create(FOO_BAR_TYPE foobar)
{
if (ModelState.IsValid)
{
// GetNextSequenceValue() deals with Oracle+EF issue with auto-increment IDs
foobar.FOO_BAR_ID = _repo.GetNextSequenceValue();
_repo.Add(foobar);
_repo.SaveChanges();
return RedirectToAction("Index");
}
return View(foobar); // display the updated Model
}
simonjreid 为我解释了答案:必须将 ObjectContext 添加到 StructureMap 配置中(存储库的目的是包装由 EntityFramework 生成的上下文,我将其称为 MyContextWrapper。因此,因为存储库依赖于 MyContextWrapper,而后者又依赖于 MyContextWrapper取决于 ObjectContext):
// This avoids 'No Default Instance for ...DbConnection' exception
x.For<System.Data.Objects.ObjectContext>().Use<MyContextWrapper>();
x.For<System.Web.Mvc.IController>().Use<Controllers.FooBarController>().Named("foobarcontroller"); // note that Named is required and is Case Sensitive
但是,现在我得到了 StructureMap 运行时异常:
结构图异常代码:205
缺少请求的实例属性“connectionString”
在阅读了 Jeremy Miller A Gentle Quickstart 的帖子(位于底部)之后,我发现您可以定义要传递给已注册类型的构造函数的参数,即我需要将连接字符串传递给MyCustomContext 类(这里是我如何初始化 ObjectFactory 的完整列表:
string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["MyContextWrapper"].ConnectionString;
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
// Make sure BUSINESS_DOMAIN assembly is scanned
scan.AssemblyContainingType<BUSINESS_DOMAIN.MyContextWrapper>();
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
// 'connStr' below is a local variable defined above
x.For<System.Data.Objects.ObjectContext>()
.Use<MyContextWrapper>()
.Ctor<string>().Is(connStr);
x.For<System.Web.Mvc.IController>().Use<Controllers.FooBarController>().Named("foobarcontroller");
});
然后砰!现在可以让我的 Controller 在运行时通过 StructureMap 实例化,并让它注入 IRepository 的一个实例......快乐的日子。