【发布时间】: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