我有一个界面:
public interface IProductRepository {
IEnumerable<Product> Products { get; }
}
方法:
public IEnumerable<Product> getProducts() { }
我的控制器:
public class ProductController : Controller
{
private IProductRepository repository;
public ProductController(IProductRepository productRepository) {
this.repository = productRepository;
}
public ViewResult List() {
return View(repository.Products);
}
}
我试图在AddBindings(){
中将它们绑定在一起productDAL db = new productDAL();
IEnumerable<Product> help = db.getProducts();
kernel.Bind<IProductRepository>().To< >;
我试图使用这种方法而不是像这样:
Mock<IProductRepostiory> mock = new Mock<IProductRespository>();
mock.Setup(m => m.Products).Returns(new List<Product> {
new Product { Name= ... }
kernel.Bind<IProductRepository>().ToConstant(mock.Object);
但使用像ToMethod之类的东西。 getProducts()从数据库返回一个IEnumerable,然后我想让ninject注入到ProductsController中,所以我可以将一个List放到View中。我知道Product类不继承IProductDepository,也不是有意的productDAL。
这是在我的DependencyResolver类中。
有人可以帮忙解决这里的约束问题,我错过了一些演员,谢谢你。
我明白了,这就是我为解决这个问题所做的事情:
我有一个界面:
public interface IProductRepository {
IEnumerable<CountyDataset> Products { get; }
}
我有一个MVC控制器:
public class ProductController : Controller
{
private IProductRepository repository;
public ProductController(IProductRepository productRepository) {
this.repository = productRepository;
}
public ViewResult List() {
return View(repository.Products);
}
}
我有一个DAL:
public class productDAL: databaseDAL {
public productDAL() {
}
public IEnumerable<CountyDataset> Products {
get { ... }
}
}
这就是我所遗漏的......
现在我有一个产品库(和朋友们哈哈):
public class lcProducts : IProductRepository {
private productDAL context = new productDAL();
public IEnumerable<CountyDataset> Products {
get { return context.Products; }
}
}
这是我更正的DI容器:
private void AddBindings() {
...
kernel.Bind<IProductRepository>().To<lcProducts>();
}
答案 0 :(得分:0)
你不能 - 这些类型不匹配。您必须绑定到IProductRepository
的实例。看起来你的db
对象实现了接口,所以试一试:
kernel.Bind<IProductRepository>().To<productDAL>();
.
.
.
var db = kernel.Get<IProductRepository>();
IEnumerable<Product> help = db.getProducts();
请记住,这并不是非常适合你。您应该将IProductRepository
作为构造函数依赖于DI的其他类才能真正发挥其魔力。这是您提供的相应课程。
public class ProductController : Controller
{
private IProductRepository repository;
public ProductController(IProductRepository productRepository) {
this.repository = productRepository;
}
public ViewResult List() {
return View(repository.Products);
}
}
您的依赖解析器现在看起来像这样:
kernel.Bind<SomeConsumerOfProductRepository>().ToSelf();
kernel.Bind<Controller>().To<ProductController>();
.
.
.
var consumer = kernel.Get<Controller>();
//Use consumer or do whatever you have to do....
这将允许Ninject自动检测ProductController
是否依赖IProductRepository
,您已绑定到某个实现,并为您解决此问题。除此之外,如果需要,您可以轻松地无缝更改ProductController
Controller
的新实施。{{1}}