亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET系列:單元測試之StructureMap

2019-11-14 14:14:56
字體:
來源:轉載
供稿:網友

asp.net使用StructureMap等依賴注入組件時最重要就是EntityFramework的DbContext對象要保證在每次HttPRequest只有一個DbContext實例,這里將使用第三方提供的HttpSimulator進行測試。

1.定義IDependency接口

創建屏蔽不同依賴注入組件使用差別的接口。

public interface IDependency{    void Build();    void EndRequest();    void AddTransient(Type from, Type to, object instance = null);    void AddScoped(Type from, Type to, object instance = null);    void AddSingleton(Type from, Type to, object instance = null);    object GetInstance(Type type);    IEnumerable GetAllInstances(Type type);}

2.提供StructureMap的適配類StructureMapAdapter

public class StructureMapAdapter : IDependency, IDisposable{    private bool _disposed = false;    private Container _container;    private Registry _registry;    public StructureMapAdapter()    {        this._registry = new Registry();    }    public void Build()    {        _container = new Container(_registry);    }    public void EndRequest()    {        HttpContextLifecycle.DisposeAndClearAll();    }    public void AddTransient(Type from, Type to, object instance = null)    {        if (instance == null)        {            _registry.For(from).Use(to).LifecycleIs<TransientLifecycle>();        }        else        {            _registry.For(from).Use(instance).LifecycleIs<TransientLifecycle>();        }    }    public void AddScoped(Type from, Type to, object instance = null)    {        if (instance == null)        {            _registry.For(from).Use(to).LifecycleIs<HttpContextLifecycle>();        }        else        {            _registry.For(from).Use(instance).LifecycleIs<HttpContextLifecycle>();        }    }    public void AddSingleton(Type from, Type to, object instance = null)    {        if (instance == null)        {            _registry.For(from).Use(to).LifecycleIs<SingletonLifecycle>();        }        else        {            _registry.For(from).Use(instance).LifecycleIs<SingletonLifecycle>();        }    }    public object GetInstance(Type type)    {        return _container.GetInstance(type);    }    public IEnumerable GetAllInstances(Type type)    {        return _container.GetAllInstances(type);    }    public void Dispose()    {        Dispose(true);        GC.SuppressFinalize(this);    }    protected virtual void Dispose(bool disposing)    {        if (!_disposed)        {            if (disposing)            {                this._container.Dispose();            }            _disposed = true;        }    }}

3.使用HttpSimulator進行單元測試

public class StructureMapAdapterTest{    [Fact]    public void TransientTest()    {        IDependency dependency = new StructureMapAdapter();        dependency.AddTransient(typeof(ITest), typeof(Test));        dependency.Build();        var version1 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;        var version2 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;        Assert.NotEqual(version1, version2);    }    [Fact]    public void SingletonTest()    {        IDependency dependency = new StructureMapAdapter();        dependency.AddSingleton(typeof(ITest), typeof(Test));        dependency.Build();        var version1 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;        var version2 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;        Assert.Equal(version1, version2);    }    [Fact]    public void ScopedTest()    {        var version1 = "";        var version2 = "";        using (HttpSimulator simulator = new HttpSimulator())        {            IDependency dependency = new StructureMapAdapter();            dependency.AddScoped(typeof(ITest), typeof(Test));            dependency.Build();            simulator.SimulateRequest(new Uri("http://localhost/"));            version1 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;            version2 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;            Assert.Equal(version1, version2);        }        using (HttpSimulator simulator = new HttpSimulator())        {            IDependency dependency = new StructureMapAdapter();            dependency.AddScoped(typeof(ITest), typeof(Test));            dependency.Build();            simulator.SimulateRequest(new Uri("http://localhost/"));            version1 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;        }        using (HttpSimulator simulator = new HttpSimulator())        {            IDependency dependency = new StructureMapAdapter();            dependency.AddScoped(typeof(ITest), typeof(Test));            dependency.Build();            simulator.SimulateRequest(new Uri("http://localhost/"));            version2 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;        }        Assert.NotEqual(version1, version2);    }}public interface ITest{    String Version { get; }}public class Test : ITest{    private string _version = Guid.NewGuid().ToString();    public string Version { get { return this._version; } }}

運行結果:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品按摩视频| 九九久久精品一区| 91中文精品字幕在线视频| 国产婷婷97碰碰久久人人蜜臀| 成人精品aaaa网站| 91精品国产乱码久久久久久久久| 亚洲欧美日韩精品久久亚洲区| 国产亚洲精品美女久久久久| 精品国产乱码久久久久久虫虫漫画| 中文字幕最新精品| 久久综合网hezyo| 国产成人亚洲综合| 亚洲福利精品在线| 久久这里有精品视频| 日韩精品一二三四区| 亚洲人成电影网站色www| 亚洲国产精品视频在线观看| 亚洲国产精品字幕| 欧美激情中文字幕在线| 欧美日在线观看| 日韩电影免费观看在线| 亚洲国产成人久久| 国产精品手机播放| 久久久99免费视频| 亚州精品天堂中文字幕| 精品久久久久久亚洲国产300| 久久午夜a级毛片| 日本精品久久久久久久| 亚洲女人被黑人巨大进入al| 69久久夜色精品国产69乱青草| 日韩在线视频观看| 国产精品视频资源| 欧美日韩中文字幕在线| 日韩国产激情在线| 日韩一区二区三区国产| 欧美亚洲在线观看| 国产一区二区色| 久久99久久99精品中文字幕| 精品无人区乱码1区2区3区在线| 欧美孕妇与黑人孕交| 午夜精品一区二区三区在线播放| 亚洲第一网站免费视频| 国产精品视频yy9099| 亚洲伊人久久大香线蕉av| 国产欧亚日韩视频| 国产在线观看一区二区三区| 日韩在线观看免费全集电视剧网站| 色综合久久精品亚洲国产| 国产成人激情小视频| 黑人巨大精品欧美一区二区一视频| 欧美日韩一区二区在线播放| 精品一区二区三区三区| 国产精品一区二区电影| 欧美性xxxxx| 国产亚洲福利一区| 欧美日产国产成人免费图片| 美日韩精品免费观看视频| 欧美成人免费小视频| 8050国产精品久久久久久| 精品一区精品二区| 久热在线中文字幕色999舞| 成人性生交大片免费看小说| 欧美日韩在线视频首页| 91免费人成网站在线观看18| 在线免费看av不卡| 亚洲国产又黄又爽女人高潮的| 欧美极品少妇xxxxⅹ喷水| 亚洲精品成人久久电影| 精品久久久久久久久国产字幕| 国产精品高清在线| 欧美精品videos性欧美| 在线观看久久久久久| 久久免费视频网站| 欧美一区二区三区精品电影| 欧美视频精品一区| 久久久久亚洲精品成人网小说| 欧美性xxxx在线播放| 欧美一级免费看| 亚洲天堂色网站| 2018中文字幕一区二区三区| 亚洲欧美激情在线视频| 欧美一区二区三区精品电影| 伊人久久久久久久久久久久久| 亚洲奶大毛多的老太婆| 国产成人精品免高潮费视频| 国产中文欧美精品| 国产日韩欧美另类| 国产91免费观看| 亚洲精品资源美女情侣酒店| 欧美亚洲日本黄色| 国产精品中文久久久久久久| 亚洲精品美女免费| 狠狠色狠狠色综合日日小说| 亚洲国产日韩欧美在线图片| 亚洲三级 欧美三级| 日韩中文字幕精品视频| 日韩精品在线第一页| 国产精品影片在线观看| 亚洲成人aaa| 国语自产精品视频在线看抢先版图片| 久久色免费在线视频| 国产日韩欧美在线观看| 成人精品久久av网站| 国产亚洲日本欧美韩国| 九九热视频这里只有精品| 国产综合香蕉五月婷在线| 成人免费淫片aa视频免费| 亚洲视频第一页| 成人网在线免费观看| 亚洲国产精品悠悠久久琪琪| 91欧美激情另类亚洲| 色偷偷偷综合中文字幕;dd| 有码中文亚洲精品| 国产免费一区二区三区在线能观看| 亚洲精品免费一区二区三区| 欧美一区三区三区高中清蜜桃| 欧美性猛交xxxx免费看久久久| 国产精品91视频| 另类色图亚洲色图| 日韩三级成人av网| 91精品视频观看| 欧美大尺度在线观看| 国产精品大片wwwwww| 欧美成人午夜剧场免费观看| 91精品国产高清久久久久久91| 欧美成人自拍视频| 欧美在线精品免播放器视频| 亚洲精品一区中文| 欧美亚洲一级片| 欧美一级电影免费在线观看| 国产日韩欧美视频| 国产成人精品av| 中文字幕日韩欧美精品在线观看| 精品国偷自产在线视频99| 国产精品wwwwww| 久久精品国产电影| 尤物yw午夜国产精品视频明星| 国产成人精品视频| 中文字幕av一区| 欧美视频13p| 国产精品久久久久77777| 亚洲人午夜色婷婷| 国产成人avxxxxx在线看| 日韩女优人人人人射在线视频| 国产在线精品播放| 日本精品一区二区三区在线| 精品人伦一区二区三区蜜桃免费| 在线观看日韩www视频免费| 亚洲综合日韩在线| 国产欧美精品日韩精品| 久久久国产91| 91久久综合亚洲鲁鲁五月天| 精品欧美aⅴ在线网站| 最近2019中文字幕一页二页| 91精品国产高清自在线看超| 久久久久久国产免费| 久久久电影免费观看完整版| 日韩69视频在线观看| 亚洲精品日韩在线| 国产视频精品免费播放| 在线视频欧美日韩精品| 国产视频精品一区二区三区| 精品久久久香蕉免费精品视频| 欧美午夜片欧美片在线观看|