class - C# Interface Method calls from a controller -
i working on application architecture , may sound stupid question please explain me how following works:
interface:
public interface imatterdal { ienumerable<matter> getmattersbycode(string input); ienumerable<matter> getmattersbysearch(string input); }
class:
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; }
controller:
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 var results = _publisheddata.getmattersbysearch(searchtext).select( matter => new { mattercode = matter.code, mattername = matter.name, matter.clientcode, matter.clientname }); return json(results); }
this works, when call controller method jquery , step it, call _publisheddata method, goes class matterdal.
i want know how controller know go matterdal implementation of interface imatterdal. if have class called matterdal2 based on interface. how controller know call right method?
i sorry if stupid question, baffling me.
edit:
based on responses, seems dependency being resolved:
this ninject call:
private static void registerservices(ikernel kernel) { kernel.bind<icpdmatterdal>().to<cachedcpddata>(); }
where cachedcpddata is:
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] ienumerable<matter>; if (result == null) { lock (cachelockobject) { result = httpruntime.cache[cachekey] 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); } }
the rason why code using right implementation of imatterdal
because it's being passed parameter in constructor of mattercontroller
. i'm sure code using dependency injection framework resolve imatterdal
.
in fact ninject di framework. code should have like
kernel.bind<imatterdal>().to<matterdal >();
Comments
Post a Comment