DI,IoC绑定与ninject(绑定接口到IEnumerable <t>方法)

时间:2017-04-24 14:13:40

标签: c# binding ninject

我有一个界面:

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>();
    }

1 个答案:

答案 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}}