css網(wǎng)站開發(fā)實錄新聞稿發(fā)布軟文平臺
MiddlewareService文件夾
在這個文件夾中,我們需要添加以下文件:
-
名人服務(wù).cs
-
名人服務(wù).cs
-
名人結(jié)果.cs
-
ILandmarkService.cs
-
地標(biāo)服務(wù) .cs
-
地標(biāo)結(jié)果 .cs
ICelebrityService.cs – 包裝多個串行的認(rèn)知服務(wù)來實現(xiàn)名人識別的中間服務(wù)層的接口定義,需要依賴注入
using System.Threading.Tasks;namespace CognitiveMiddlewareService.MiddlewareService
{public interface ICelebrityService{Task<CelebrityResult> Do(byte[] imgData);}
}
CelebrityService.cs – 包裝多個串行的認(rèn)知服務(wù)來實現(xiàn)名人識別中間服務(wù)層的邏輯代碼
using CognitiveMiddlewareService.CognitiveServices;
using Newtonsoft.Json;
using System.Threading.Tasks;namespace CognitiveMiddlewareService.MiddlewareService
{public class CelebrityService : ICelebrityService{private readonly IVisionService visionService;private readonly IEntitySearchService entityService;public CelebrityService(IVisionService vs, IEntitySearchService ess){this.visionService = vs;this.entityService = ess;}public async Task<CelebrityResult> Do(byte[] imgData){// get original recognized resultvar stream = Helper.GetStream(imgData);Celebrity celebrity = await this.visionService.RecognizeCelebrityAsync(stream);if (celebrity != null){// get entity search resultstring entityName = celebrity.name;string jsonResult = await this.entityService.SearchEntityAsync(entityName);EntityResult er = JsonConvert.DeserializeObject<EntityResult>(jsonResult);if (er?.entities?.value.Length > 0){// isolation layer: decouple data structure then return abstract resultCelebrityResult cr = new CelebrityResult(){Name = er.entities.value[0].name,Description = er.entities.value[0].description,Url = er.entities.value[0].url,ThumbnailUrl = er.entities.value[0].image.thumbnailUrl,Confidence = celebrity.confidence};return cr;}}return null;}}
}
小提示:上面的代碼中,用CelebrityResult接管了實體搜索結(jié)果和名人識別結(jié)果的部分有效字段,以達(dá)到解耦/隔離的作用,后面的代碼只關(guān)心CelebrityResult如何定義的即可。
CelebrityResult.cs – 抽象出來的名人識別服務(wù)的返回結(jié)果
namespace CognitiveMiddlewareService.MiddlewareService
{public class CelebrityResult{public string Name { get; set; }public double Confidence { get; set; }public string Url { get; set; }public string Description { get; set; }public string ThumbnailUrl { get; set; }}
}
ILandmarkService.cs – 包裝多個串行的認(rèn)知服務(wù)來實現(xiàn)地標(biāo)識別的中間服務(wù)層的接口定義,需要依賴注入
using CognitiveMiddlewareService.CognitiveServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace CognitiveMiddlewareService.MiddlewareService
{public interface ILandmarkService{Task<LandmarkResult> Do(byte[] imgData);}
}
LandmarkService.cs – 包裝多個串行的認(rèn)知服務(wù)來實現(xiàn)地標(biāo)識別的中間服務(wù)層的邏輯代碼
using CognitiveMiddlewareService.CognitiveServices;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace CognitiveMiddlewareService.MiddlewareService
{public class LandmarkService : ILandmarkService{private readonly IVisionService visionService;private readonly IEntitySearchService entityService;public LandmarkService(IVisionService vs, IEntitySearchService ess){this.visionService = vs;this.entityService = ess;}public async Task<LandmarkResult> Do(byte[] imgData){// get original recognized resultvar streamLandmark = Helper.GetStream(imgData);Landmark landmark = await this.visionService.RecognizeLandmarkAsync(streamLandmark);if (landmark != null){// get entity search resultstring entityName = landmark.name;string jsonResult = await this.entityService.SearchEntityAsync(entityName);EntityResult er = JsonConvert.DeserializeObject<EntityResult>(jsonResult);// isolation layer: decouple data structure then return abstract resultLandmarkResult lr = new LandmarkResult(){Name = er.entities.value[0].name,Description = er.entities.value[0].description,Url = er.entities.value[0].url,ThumbnailUrl = er.entities.value[0].image.thumbnailUrl,Confidence = landmark.confidence};return lr;}return null;}}
}
小提示:上面的代碼中,用LandmarkResult接管了實體搜索結(jié)果和地標(biāo)識別結(jié)果的部分有效字段,以達(dá)到解耦/隔離的作用,后面的代碼只關(guān)心LandmarkResult如何定義的即可。
LandmarkResult.cs – 抽象出來的地標(biāo)識別服務(wù)的返回結(jié)果
namespace CognitiveMiddlewareService.MiddlewareService
{public class LandmarkResult{public string Name { get; set; }public double Confidence { get; set; }public string Url { get; set; }public string Description { get; set; }public string ThumbnailUrl { get; set; }}
}
Processors文件夾
在這個文件夾中,我們需要添加以下文件:
-
IProcessService.cs
-
進(jìn)程服務(wù) .cs
-
聚合結(jié)果.cs
IProcessService.cs – 任務(wù)調(diào)度層服務(wù)的接口定義,需要依賴注入
using System.Threading.Tasks;namespace CognitiveMiddlewareService.Processors
{public interface IProcessService{Task<AggregatedResult> Process(byte[] imgData);}
}
ProcessService.cs – 任務(wù)調(diào)度層服務(wù)的邏輯代碼
using CognitiveMiddlewareService.MiddlewareService;
using System.Collections.Generic;
using System.Threading.Tasks;namespace CognitiveMiddlewareService.Processors
{public class ProcessService : IProcessService{private readonly ILandmarkService landmarkService;private readonly ICelebrityService celebrityService;public ProcessService(ILandmarkService ls, ICelebrityService cs){this.landmarkService = ls;this.celebrityService = cs;}public async Task<AggregatedResult> Process(byte[] imgData){// preprocess// todo: create screening image classifier to get a rough category, then decide call which service// task dispatcher: parallelized run 'Do'// todo: put this logic into Dispatcher serviceList<Task> listTask = new List<Task>();var taskLandmark = this.landmarkService.Do(imgData);listTask.Add(taskLandmark);var taskCelebrity = this.celebrityService.Do(imgData);listTask.Add(taskCelebrity);await Task.WhenAll(listTask);LandmarkResult lmResult = taskLandmark.Result;CelebrityResult cbResult = taskCelebrity.Result;// aggregator// todo: put this logic into Aggregator serviceAggregatedResult ar = new AggregatedResult(){Landmark = lmResult,Celebrity = cbResult};return ar;// ranker// todo: if there have more than one result in AgregatedResult, need give them a ranking// output generator// todo: generate specified JSON data, such as Adptive Card}}
}
小提示:大家可以看到上面這個文件中有很多綠色的注釋,帶有todo文字的,對于一個更復(fù)雜的系統(tǒng),可以用這些todo中的描述來設(shè)計獨(dú)立的模塊。
AggregatedResult.cs – 任務(wù)調(diào)度層服務(wù)的最終聚合結(jié)果定義
using CognitiveMiddlewareService.MiddlewareService;namespace CognitiveMiddlewareService.Processors
{public class AggregatedResult{public LandmarkResult Landmark { get; set; }public CelebrityResult Celebrity { get; set; }}
}