使用Ninject进行.NET MVC依赖注入

11

我刚开始学习在.NET上编程,实现依赖注入(使用Ninject)时遇到了一些问题。

我正在创建一种餐饮应用程序,用户可以浏览城镇,在城镇中浏览餐馆,在餐馆中浏览食物。

我正在使用UnitOfWork和Repository模式,例如,我这样按id访问town:

_unitOfWork.TownRepository.GetByID(id);

现在我开始将服务实现到应用程序中,我遇到了需要进行依赖注入的情况。

我已经创建了ITownServiceIRestaurantServiceIFoodService(因为在我的UnitOfWork中有TownRepositoryRestaurantRepositoryFoodRepository)。

TownService的示例外观:

public class TownService : ITownService
    {
        // initialize UnitOfWork
        private IUnitOfWork _unitOfWork;

        public TownService()
            : this(new UnitOfWork())
        {
        }

        public TownService(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }

        public Town GetByID(object id)
        {
            return _unitOfWork.TownRepository.GetByID(id);
        }

        public IEnumerable<Town> GetAll()
        {
            return _unitOfWork.TownRepository.Get();
        }

        public bool Insert(Town town)
        {
            // validation logic
            if (!ValidateTown(town))
                return false;

            try
            {
                _unitOfWork.TownRepository.Insert(town);
                _unitOfWork.Save();
            }
            catch
            {
                return false;
            }

            return true;
        }

        public bool Delete(object id)
        {
            try
            {
                _unitOfWork.TownRepository.Delete(id);
                _unitOfWork.Save();
            }
            catch
            {
                return false;
            }

            return true;
        }

        public bool Update(Town townToUpdate)
        {
            // validation logic
            if (!ValidateTown(townToUpdate))
                return false;

            try
            {
                _unitOfWork.TownRepository.Update(townToUpdate);
                _unitOfWork.Save();
            }
            catch
            {
                return false;
            }

            return true;
        } 
    }

我还没有实现FoodServiceRestaurantService,但它们应该是相似的,当然会有一些额外的方法,除了我已经有的方法。例如在RestaurantService中,我可能会有类似于public Restaurant GetRestaurantsInTown(Town town){}的方法。

希望你对应用程序有所了解。现在让我们回到Ninject

在我的TownController中,我会有类似这样的内容:

 public class TownController : Controller
    {

        private ITownService _townService;

        public TownController(ITownService townService)
        {
            _townService = townService;
        }
    }

对于RestaurantControllerFoodController同样只需要构造函数注入。

在这种例子中我该如何使用Ninject呢? 我需要一个全局的IService而不是ITownServiceIRestaurantServiceIFoodService吗? 在TownServiceRestaurantServiceFoodService中我应该继承哪个服务接口呢?或者像这样也可以吗?

绑定时我需要绑定什么?

kernel.Bind<IUnitOfWork>().To<UnitOfWork>();
kernel.Bind<ITownService>().To<TownService>();
kernel.Bind<IRestaurantService>().To<RestaurantService>();
kernel.Bind<IFoodService>().To<TownService>();

需要这样做吗?

简而言之 - 我需要用 Ninject 添加依赖注入,我遇到了一些问题,需要帮助。

非常感谢您提前的帮助。


你好,目前你是如何在控制器中定义构造函数的?在上面的例子中,你只传递了 ITownService,那么 IRestaurantServiceIFoodService 呢?你是如何创建这些变量的? - Nitin Sawant
1个回答

17

从包管理器控制台运行以下命令:

Install-package Ninject.MVC3

这将向App_Start/NinjectWebCommon.cs添加一个类。

如果你靠近底部看到了一个RegisterServices方法。

你只需在那里添加你问题中的代码,即:

    private static void RegisterServices(IKernel kernel)
    {
      kernel.Bind<IUnitOfWork>().To<UnitOfWork>();
      kernel.Bind<ITownService>().To<TownService>();
      kernel.Bind<IRestaurantService>().To<RestaurantService>();
      kernel.Bind<IFoodService>().To<TownService>();
    }

这就是所需的全部吗? - Želja Huber
@ŽeljaHuber 是的,那是最快的入门方式。有时候,如果你的项目变得很大,人们更喜欢将激活器拆分成自己的项目。你成功了吗? - hutchonoid
是的,这给了我一个很好的开始,非常感谢。我还在谷歌上搜索一下如何更改我的服务层,但我想我会按照你写的方式去实现Ninject。再次感谢。 - Želja Huber
2
以上绑定中只有一个问题 - 假设我有100个服务类和每个类都有100个接口,那么我需要编写100个Kernel.Bind语句将服务绑定到接口吗? - pm86
@hutchonoid 谢谢你的信息。我有一个疑问。我想为我的Service和DataAccess文件执行依赖注入。如果我在Web项目中配置它们两个,这不会影响我的分层架构吗?(因为我需要在这里包含我的DataAccess Dlls) - Ranjith V
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接