【问题标题】:C# Interface Method calls from a controller来自控制器的 C# 接口方法调用
【发布时间】:2014-05-29 21:22:27
【问题描述】:

我只是在研究一些应用程序架构,这听起来可能是一个愚蠢的问题,但请向我解释以下是如何工作的:

界面:

public interface IMatterDAL
{
    IEnumerable<Matter> GetMattersByCode(string input);
    IEnumerable<Matter> GetMattersBySearch(string input);
}

类:

 public class MatterDAL : IMatterDAL
{
    private readonly Database _db;

    public MatterDAL(Database db)
    {
        _db = db;
        LoadAll(); //Private Method
    }

    public virtual IEnumerable<Matter> GetMattersBySearch(string input)
    {
        //CODE
        return result;
    }

    public virtual IEnumerable<Matter> GetMattersByCode(string input)
    {
       //CODE
        return results;
    }

控制器:

public class MatterController : ApiController
{
    private readonly IMatterDAL _publishedData;

    public MatterController(IMatterDAL publishedData)
    {
        _publishedData = publishedData;
    }

    [ValidateInput(false)]
    public JsonResult SearchByCode(string id)
    {
        var searchText = id; //better name for this
        var results = _publishedData.GetMattersBySearch(searchText).Select(
            matter =>
            new
                {
                    MatterCode = matter.Code,
                    MatterName = matter.Name, 
                    matter.ClientCode, 
                    matter.ClientName
                });
        return Json(results);
    }

这很有效,当我从 jquery 调用我的控制器方法并进入它时,对 _publishedData 方法的调用进入了 MatterDAL 类。

我想知道我的控制器如何知道转到接口 IMatterDAL 的 MatterDAL 实现。如果我有另一个基于接口的名为 MatterDAL2 的类怎么办。我的控制器如何知道调用正确的方法?

如果这是一个愚蠢的问题,我很抱歉,这让我感到困惑。

编辑:

根据响应,似乎这是解决依赖关系的地方:

这是一个 ninject 调用:

        private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ICpdMatterDAL>().To<CachedCpdData>();
    }

CachedCpdData 在哪里:

public class CachedCpdData : ICpdMatterDAL
{
    private static readonly object CacheLockObject = new object();

    private readonly MatterDAL _matterData;

    public CachedCpdData()
    {
        _matterData = DomainModel.DataAccessManager.Instance.Matters;
    }

    public IEnumerable<Matter> GetMattersForAutoCompleteByCode(string input)
    {
        var cacheKey = string.Format("matter-search-{0}", input ?? "");
        var result = HttpRuntime.Cache[cacheKey] as IEnumerable<Matter>;
        if (result == null)
        {
            lock (CacheLockObject)
            {
                result = HttpRuntime.Cache[cacheKey] as IEnumerable<Matter>;
                if (result == null)
                {
                    result = _matterData.GetMattersForAutoCompleteByCode(input).ToList();
                    HttpRuntime.Cache.Insert(cacheKey, result, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero);
                }
            }
        }
        return result;
    }

    public IEnumerable<Matter> GetMattersByMatterCodeSearch(string input)
    {
        return _matterData.GetMattersByMatterCodeSearch(input);
    }
}

【问题讨论】:

  • 那么你的 MatterController 构造函数是什么?大概你有一个 IoC 容器在某个地方修复了你所有的依赖项,但你还没有告诉我们任何关于它的事情......
  • 我正在通过我的 jquery 的 AJAX 调用调用事务控制器。这是我继承的应用程序,所以我不确定是否构建了 IoC 容器。我唯一跳过的另一件事,事后看来可能有用的是应用程序正在使用 Ninject 并且它正在注册接口,我将把代码添加到我的主要问题中
  • 鉴于 Ninject 是一个 DI 系统,其工作是将接口的正确实现注入到您的控制器中,我想您已经回答了自己的问题...
  • "应用程序正在使用 Ninject" - 好了。这就是 IoC 容器……
  • 谢谢大家! :尴尬:

标签: c# class model-view-controller interface


【解决方案1】:

您的代码使用IMatterDAL 的正确实现的原因是因为它在MatterController 的构造函数中作为参数传递。我几乎可以肯定您的代码正在使用一些Dependency Injection framework 来解析IMatterDAL

事实上,Ninject 是一个 DI 框架。你的代码应该有类似

kernel.Bind&lt;IMatterDAL&gt;().To&lt;MatterDAL &gt;();

【讨论】:

  • 看来你是对的,在我进一步做之后,我看到了一个解决 IMatterDAL 的 ninject 实现。非常感谢!
  • @ArjaaAine 很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 2017-05-06
  • 1970-01-01
  • 2019-09-17
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多