2

在我的项目中,我对 IRepositoryProvider 有一个控制器依赖项。

public class HomeController : BaseController
{
    public HomeController(ISessionWrapper sessionWrapper,
                          IRepositoryProvider repositoryProvider,
                          IApplicationConfiguration applicationConfiguration)
        : base(sessionWrapper, repositoryProvider, applicationConfiguration)
    {}

    ...

}

IRepositoryProvider 及其实现位于 BLL 层中。另一件需要注意的是 IRepositoryProvider 也有一些参数。这些用于确定要使用的连接字符串(环境*5 可能的连接)。

    public RepositoryProvider(string environment, IApplicationConfiguration applicationConfiguration)
    {
        _applicationConfiguration = applicationConfiguration;
        _environment = environment;
    }

这一切都适用于两层和这个 Ninject 配置。

kernel.Bind<IRepositoryProvider>()
      .To<RepositoryProvider>()
      .InRequestScope()
      .WithConstructorArgument("environment",    
                                context => context.Kernel.Get<ISessionWrapper>().CurrentEnvironment)
      .WithConstructorArgument("applicationConfiguration",
                                context => context.Kernel.Get<IApplicationConfiguration>());

当我引入服务层时,我的问题就出现了。我不想依赖控制器中的 IRepositoryProvider 进行数据访问,而是想使用服务层。理想情况下,我不想引用 BLL 层,而只想引用 Service 层。

public class HomeService : IHomeService
{
    public IRepositoryProvider RepositoryProvider { get; private set; }

    public HomeService(IRepositoryProvider repositoryProvider)
    {
        RepositoryProvider = repositoryProvider;
    }
    ...
}

所以我的问题是:我是否可以不从 MVC 项目中同时引用 Service 和 BLL 层?或者这整个设置是否有大量代码气味?

谢谢。

更新:我想我应该说我的理想参考。网络 -> 服务 -> BLL。目前,Web 引用 Service 和 BLL 以便 Ninject 解决所有问题。

更新2:这似乎是一个可能的解决方案?如何告诉 Ninject 绑定到它没有引用的实现

4

2 回答 2

3

这就是我通常根据需求构建 MVC 项目的方式。

表示层 > 服务层 > 业务层 > 数据访问层。

表示层包含:ViewModels、Views、Controllers。(参考服务层,Ninject ddl)

服务层:WCF。(参考 BAL 等)

业务层:包含我所说的 Orchestrator 及其接口(参考 DAL、域)

数据访问层:包含存储库及其接口(参考域)

域:包含 POCO 对象

核心:我实际安装和配置 Ninject 的地方(参考 BAL、DAL 等)

要将 Ninject 添加到表示层以外的另一个项目:

将以下内容添加到 Global.Asasx.cs:

DependencyResolver.SetResolver(new NinjectDependencyResolver());

然后创建一个新项目sucche作为核心。在那里安装 Ninject 并添加以下类:

您需要从表示层引用 Ninject dll

 public class NinjectDependencyResolver : IDependencyResolver {
    private IKernel kernel;

    public NinjectDependencyResolver() 
    {
        kernel = new StandardKernel();
        AddBindings();
    }

    public object GetService(Type serviceType) 
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType) 
    {
        return kernel.GetAll(serviceType);
    }

    public IBindingToSyntax<T> Bind<T>() 
    {
        return kernel.Bind<T>();
    }

    public IKernel Kernel 
    {
        get { return kernel; }
    }

    private void AddBindings() 
    {
        //Add your Bindings here
    }

}
于 2013-04-19T18:09:39.993 回答
2

IRepositoryProvider 及其实现存在于 BLL 层中......我是否可以不同时引用 MVC 项目中的 Service 和 BLL 层

根据您的这两个陈述,答案是否定的,您“不”不可能引用这些层。最小化引用的最佳方法是将接口与实现分开。例如,您可以拥有以下内容:

域层,包含你的 POCO 和接口

  • 产品(样本类)
  • IRepository(一个接口)

服务层,包含接口的实现

  • Domain对图层有参考
  • 工具IRepository(例如ProductRepository : IRepository

依赖注入层

  • 知道DomainService

MVC 项目

  • 参考该Domain层以了解 POCO 和存储库签名
  • 对图层有参考,DI但不知道它是如何工作的。所以你可以稍后换掉 DI 框架,一切仍然有效。

您可以根据需要扩展该层。您可以在and层BLL之间插入层,您不需要在任何地方引用它。DomainService

于 2013-04-19T18:22:56.877 回答