【问题标题】:Using static method with IOC data access使用带有 IOC 数据访问的静态方法
【发布时间】:2016-07-14 15:04:50
【问题描述】:

我有一个使用存储库模式的 MVC 项目。我也将 Ninject 用于 IOC 容器。我在项目加载时存储一些缓存值时遇到问题。

在我的 Global.asax.cs 我有:

...(some settings)
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
....
...CustomDataCache.Configure();

在我的 ControllerFactory 中有我需要的绑定:

_ninjectKernal.Bind<IDataContext>().To<DataContext>()
            .WithConstructorArgument("appNamekey", "Name of Data Application")
            .WithConstructorArgument("serverLocationNameKey", "Location of Application Server");

在我的 CustomCache 类中,我想做类似的事情:

private IDataContext _context;

private CustomDataCache(IDataContext context)
    {
        _context = context;
    }

public static void Configure(){
  System.Web.HttpContext.Current.Cache["NDECCategories"] = _context.GetNdecCategories();

我想从全局静态调用 Configure(),但是当我需要 DataContext 的实例时,我该怎么做?

谢谢,

【问题讨论】:

  • 请解释“我想静态调用 Configure()”...你想实现什么,为什么?你想让Configure 是一个静态方法,所以它可以在没有实例的情况下调用吗?如果是这样,Global.asax 似乎是设置上下文的错误方法。您的上下文也必须是静态的,因此静态值在您的所有用户之间共享——您将在每个用户的每个请求上覆盖上下文,但对于所有人。这似乎是错误的或浪费的。而且,在这种情况下,您不会从使用带静态的 IOC 中受益。

标签: c# asp.net-mvc static inversion-of-control


【解决方案1】:

解决依赖关系各不相同。 对于网络表单...

Public Class _Default
    Inherits Page

    <Dependency()>
    Public Property _userService As IUserService

对于 MVC

public UserController(IDataContextAsync context)

实际上,您不需要直接从 Web 应用程序访问数据上下文。您应该访问在构造函数中设置了 IDataContextAsync 的服务...

Public Class UserService
    Inherits Service(Of User)
    Implements IUserService

    Private ReadOnly _repository As IRepositoryAsync(Of User)

    Public Sub New(repository As IRepositoryAsync(Of User))
        MyBase.New(repository)
        _repository = repository
    End Sub

【讨论】:

    【解决方案2】:

    为什么不在Configure 方法中将类别作为参数传递?

    var _context = DependencyResolver.Current.GetService<IDataContext>();
    var categories = _context.GetNdecCategories();
    CustomDataCache.Configure(categories);
    

    【讨论】:

    • 如果我把它放在 GLobal.asax 中,那么我在 var categories = _context.GetNdecCategories(); 上得到一个空引用异常;
    猜你喜欢
    • 2012-04-19
    • 2012-06-03
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2021-11-13
    • 2018-06-14
    相关资源
    最近更新 更多