C# 应用程序启动事件流
我正在处理一个问题,我试图在Selenium SpecFlow项目中实例化一个共享资源。资源是一个登录名池(字典) 限制条件1:应用程序设计为一次登录的时间不超过登录时的时间。也就是说,许多不同的用户可以同时登录,但同一用户不应同时登录。因此,字典中的项目需要一次限制为一个线程 约束2:项目上没有依赖注入,我正在寻找应用程序状态事件的等价物 注1:我来自MVC ASP.NET背景,我会使用global.asax App_Start()方法 注2:我将从步骤定义到“保留”登录以及从钩子到“释放”登录访问我的字典 Specflow中有类似的东西吗 谢谢 德文 更新日期:2020年9月24日: 我对这个问题做了更多的研究,我决定参加一个单身班。在第一次调用之前,不会实例化Singleton,然后只实例化单个实例 更新日期:2020年9月24日#1: 我发现使用Singleton模式有一个警告,问题是我们的Specflow项目配置为“带内存隔离的并行执行”,这意味着您不能在线程之间共享状态,根据Specflow,这似乎是推荐的方式。当我发现我的字典有25个独特的实例时,我很难发现这一点 也就是说,我不确定即使我实现了DI框架,它也不会有同样的问题 我现在正在寻找其他形式的持久存储,可能会尝试Azure存储表C# 应用程序启动事件流,c#,selenium,specflow,selenium-grid,C#,Selenium,Specflow,Selenium Grid,我正在处理一个问题,我试图在Selenium SpecFlow项目中实例化一个共享资源。资源是一个登录名池(字典) 限制条件1:应用程序设计为一次登录的时间不超过登录时的时间。也就是说,许多不同的用户可以同时登录,但同一用户不应同时登录。因此,字典中的项目需要一次限制为一个线程 约束2:项目上没有依赖注入,我正在寻找应用程序状态事件的等价物 注1:我来自MVC ASP.NET背景,我会使用global.asax App_Start()方法 注2:我将从步骤定义到“保留”登录以及从钩子到“释放”登
- 参考:单例模式-
- Ref:Specflow与内存(AppDomain)隔离并行执行-
约束2:项目上没有依赖注入,我正在寻找应用程序状态事件的等价物 您说没有依赖项注入,但是由于您使用的是SpecFlow,所以您已经有了BoDi依赖项注入框架。此外,SpecFlow已经以线程安全的方式提供了自己的步骤间共享数据的方式:ScenarioContext对象 只需在步骤定义构造函数中将ScenarioContext对象声明为参数(请参见),将其分配给字段,然后在步骤中使用它。您可以在多个类中执行此操作以共享数据(请参阅):
ScenarioContext对象作为构造函数参数传递,每个测试初始化一个对象。这使ScenarioContext对象线程安全,并启用,这正是您真正想要的。您说您没有它,但有任何理由不能添加依赖项/上下文注入吗?我很乐意为您提供锅炉板,以帮助您,如果您需要它?还可能需要它来支持框架的其他领域。Specflow在他们的文档@RichEdwards中谈论bodi和他们的方法,url中缺少连字符,看起来这是正确的:@Renat-就是那个!复制粘贴错误。接得好,谢谢你的纠正,伙计!您使用的是哪个版本的SpecFlow?SpecFlow绝对支持依赖注入。请看,依赖注入超出了我目前试图实现的范围,但我希望尽快实现它。谢谢你的推荐信。除了支持DI之外,还有没有其他方法可以在应用程序启动时,在测试开始执行之前调用代码一次。
[Binding]
public class LoginSteps
{
private readonly ScenarioContext scenario;
public LoginSteps(ScenarioContext scenario)
{
this.scenario = scenario;
}
[Given(@"User is logged in as ""(.*)""")]
public void GivenUserIsLoggedInAs(string username)
{
// log user in
scenario["LoggedInUser"] = username;
}
}
[Binding]
public class SomeOtherStepDefinitionFile
{
private readonly ScenarioContext scenario;
public SomeOtherStepDefinitionFile(ScenarioContext scenario)
{
this.scenario = scenario;
}
[When(@"some other step requiring current user")]
public void WhenSomeOtherStepRequiringCurrentUser()
{
var currentUsername = (string)scenario["LoggedInUser"];
}
}