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

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

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

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

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
久久中文字幕一区| 国产99久久精品一区二区 夜夜躁日日躁| 久久久91精品国产一区不卡| 日韩中文字幕不卡视频| 欧美日韩国产一区中文午夜| 国产日韩欧美中文在线播放| 欧美大成色www永久网站婷| 久久中文字幕国产| 一夜七次郎国产精品亚洲| 伦理中文字幕亚洲| 亚洲精品欧美日韩| 日韩成人在线视频| 亚洲xxx大片| 91精品视频一区| 日韩欧美中文第一页| 色综合五月天导航| 国产精品夜间视频香蕉| 久久精品免费播放| 欧美日韩在线视频一区二区| 色婷婷久久av| 日韩精品免费看| 国产精品1区2区在线观看| 国内精品模特av私拍在线观看| 亚洲成人精品视频| 久久亚洲欧美日韩精品专区| 91九色综合久久| 色综合久久精品亚洲国产| 精品亚洲国产成av人片传媒| 日韩中文字幕在线精品| 日韩欧美国产激情| 欧美性xxxxx极品| 精品国产一区二区三区四区在线观看| 色多多国产成人永久免费网站| 高清一区二区三区四区五区| 国产精品久久久久不卡| 成人免费xxxxx在线观看| 日韩精品在线观| 最近2019年中文视频免费在线观看| 51久久精品夜色国产麻豆| 人九九综合九九宗合| 亚洲片国产一区一级在线观看| 久久久国产精品一区| 欧美激情伊人电影| 另类专区欧美制服同性| 国产有码一区二区| 中文字幕欧美日韩在线| 国产精品久久久久久久天堂| 疯狂做受xxxx高潮欧美日本| 九九热这里只有精品免费看| 97av在线影院| 日韩免费观看高清| 亚洲男人天堂2019| 亚洲jizzjizz日本少妇| 欧美激情一二三| 久久亚洲综合国产精品99麻豆精品福利| 亚洲理论在线a中文字幕| 久久精品精品电影网| 97超碰国产精品女人人人爽| 国产精品视频最多的网站| 最近2019中文字幕在线高清| 日韩欧美高清视频| 日韩一区av在线| 中文字幕日韩在线观看| 欧美激情综合亚洲一二区| 日本sm极度另类视频| 日本精品性网站在线观看| 国产一区二区成人| 97成人精品视频在线观看| 热99精品只有里视频精品| 777午夜精品福利在线观看| 国产精品色婷婷视频| 欧美黑人性猛交| 亚洲男人天堂网站| 亚洲老头同性xxxxx| 2019亚洲日韩新视频| 中文字幕欧美日韩在线| 国产999精品久久久| 成人性生交xxxxx网站| 热久久这里只有精品| 久久精品99国产精品酒店日本| 亚洲欧美www| 日韩av免费在线看| 亚洲第五色综合网| 亚洲精品免费一区二区三区| 国产精品扒开腿做爽爽爽的视频| 欧美午夜视频一区二区| 国产精品一区二区3区| 久久天天躁夜夜躁狠狠躁2022| 一本久久综合亚洲鲁鲁| 91地址最新发布| 欧美丰满少妇xxxxx| 日韩在线观看免费| 美女福利精品视频| 亚洲自拍av在线| 7777精品视频| 国产成人精品av| 国产精品678| 久久香蕉国产线看观看网| 精品视频偷偷看在线观看| 亚洲国产美女精品久久久久∴| 国产精品人人做人人爽| 九九九热精品免费视频观看网站| 日本一区二区在线免费播放| 成人激情黄色网| 日本一区二区在线免费播放| 国产精品777| 在线播放国产一区二区三区| 91亚洲精品久久久久久久久久久久| 这里精品视频免费| 欧美成人国产va精品日本一级| 久久久久久久91| 97精品视频在线播放| 亚洲精品自拍偷拍| 热久久这里只有| 亚洲字幕在线观看| 热久久视久久精品18亚洲精品| 久久久亚洲天堂| 国产suv精品一区二区| 成人欧美在线视频| 国产精品激情av电影在线观看| 久久久久五月天| 亚洲国产精品人久久电影| 欧美一级片在线播放| 成人激情电影一区二区| 国内偷自视频区视频综合| 欧美激情一区二区三区成人| 亚洲国产成人一区| 中文字幕在线看视频国产欧美在线看完整| 国产激情久久久久| 国产精品三级网站| 亚洲免费人成在线视频观看| 国产精品黄色影片导航在线观看| 欧美激情第三页| 欧美日韩性视频在线| 不用播放器成人网| 欧美自拍视频在线| 日韩精品在线观看视频| 亚洲欧洲日产国码av系列天堂| 亚洲国产欧美一区二区三区久久| 亚洲va电影大全| 国外日韩电影在线观看| 欧美性猛交视频| 97在线视频观看| 久久久久久久久久婷婷| 久久精品视频在线播放| 国产欧美日韩高清| 日韩精品一区二区三区第95| 久久久精品美女| 日本国产高清不卡| 国产精品免费一区二区三区都可以| 欧美成年人在线观看| 国产精品 欧美在线| 91视频国产高清| 精品福利在线视频| 日韩欧美精品中文字幕| 久久视频在线看| 亚洲美女又黄又爽在线观看| 91wwwcom在线观看| 亚洲精品电影在线| 欧美疯狂做受xxxx高潮| 亚洲深夜福利在线| 性金发美女69hd大尺寸| 亚洲18私人小影院| 国产成人在线一区二区|