根据documentation我正在尝试注册我所有的IRepository实现,以便在控制器中进一步注入:
container.Register(
Classes.FromThisAssembly()
.BasedOn<IRepository>()
.WithService.Base()
.LifestyleTransient());
具体的存储库实例的使用很简单:
public class TheController : Controller
{
private MyConcreteRepository repo;
public TheController (MyConcreteRepository r)
{
repo = r;
}
public ActionResult Index()
{
var ans = repo.GiveMeData<TheDataType>();
...
...
return View();
}
}
启动应用程序它会抛出
'MyMVCWebSite.Controllers.TheController' is waiting for the following dependencies:
- Service 'MyMVCWebSite.DataUtils.MyConcreteRepository' which was not registered.
存储库层次结构类似于
public interface IRepository : IDisposable
{
...
}
public interface IAlmostConcreteRepository : IRepository
{
DbSet<TEntity> GiveMeData<TEntity>() where TEntity : class;
}
public class MyConcreteRepository : IAlmostConcreteRepository
{
protected DbContext context;
public MyConcreteRepository(DbContext dbc)
{
context = dbc;
}
public DbSet<TEntity> GiveMeData<TEntity>() where TEntity : class
{
return context.Set<TEntity>();
}
...
public void Dispose()
{
...
}
}
所以registering components one-by-one
都没有 container.Register(
Component.For<IAlmostConcreteRepository>()
.ImplementedBy<MyConcreteRepository>()
.LifestyleTransient());
也不是按照在帖子开头提到的惯例做到这一点不起作用。 只能注册具体实例:
container.Register(
Component.For<MyConcreteRepository>()
.LifestyleTransient());
或
container.Register(
Classes.FromThisAssembly()
.BasedOn(typeof(MyConcreteRepository))
.WithService.Base()
.LifestyleTransient());
我是否遗漏了文档中的内容?请帮忙。
答案 0 :(得分:1)
这里我使用了MyConcreteRepository类而不是接口,所以这就是问题所在。
public class TheController : Controller
{
private MyConcreteRepository repo;
public TheController (MyConcreteRepository r)
{
repo = r;
}
}
简单拼写错误,应该是:
public class TheController : Controller
{
private IAlmostConcreteRepository repo;
public TheController (IAlmostConcreteRepository r)
{
repo = r;
}
}