麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-14 14:14:56
字體:
供稿:網(wǎng)友

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

1.定義IDependency接口

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

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進(jìn)行單元測試

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; } }}

運(yùn)行結(jié)果:


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: a免费视频 | 国产精品久久久久久久hd | 亚洲一区动漫 | 欧产日产国产精品乱噜噜 | 中文字幕一区二区三区久久 | 精品在线观看一区 | 亚洲第一成网站 | 77成人影院 | 性插视频 | 国产精品99久久久久久宅女 | 成年人网站国产 | 免费看成年人视频在线 | 国产成人精品网站 | 成码无人av片在线观看网站 | a级毛片免费观看在线播放 日本aaa一级片 | 韩国19禁在线 | 99爱视频在线观看 | 免费啪啪| 色婷婷av一区二区三区久久 | 操毛片| 91久久精品一区二区 | 欧美日韩视频第一页 | 一级毛片免费在线 | 久久久久久久免费看 | 亚洲视频欧美 | 国产成人精品二区 | 国产毛片自拍 | 国产91九色视频 | 国产1区2区在线 | a网在线| 18被视频免费观看视频 | 国产一区精品在线观看 | 久久一本日日摸夜夜添 | 欧美a在线观看 | 久久国产不卡 | 一级毛片免费版 | 日韩黄色精品视频 | 国产精品久久久久久久久久了 | 日本aaaa片毛片免费观蜜桃 | 5a级毛片| 亚洲一区二区三区精品在线观看 |