为每个浏览器选项卡添加singlton

时间:2019-05-07 08:13:13

标签: c# asp.net-core .net-core

我正在尝试实现Web应用程序并使用单例对象,因此我可以将其注入以便在其他类中使用它。 每当用户在浏览器中打开选项卡或类似内容时,我都想打开一个新对象。例如:

public class Singleton
{
    public string Id{get;set;}
    public Singleton(){Id=Guid.NewGuid().ToString();)
}

in startup:
services.AddSingleton<Singleton>(s=>new Singleton());

在其他班级:

public class OtherClass{
    private readonly Singleton singleton;
    public OtherClass(Singleton singleton)
    {
        this.singleton = singleton;
    }
}

问题在于每个标签都具有相同的ID ...我需要为浏览器中的每个标签使用不同的ID ...

谢谢!

3 个答案:

答案 0 :(得分:0)

您必须为要成为单身人士的班级创建一个接口。您将其注册为Startup.cs中的单身人士

public void ConfigureServices(IServiceCollection services)
{
     services.AddSingleton<ISingleton, Singleton>();
}

然后,您将单例界面注入OtherClass

public class OtherClass{
private readonly Singleton singleton;
public OtherClass(ISingleton singleton)
{
    this.singleton = singleton;
}

希望这会有所帮助

答案 1 :(得分:0)

我没有足够的代表发表评论。但是,如果您愿意使用一些JavaScript,则可以在此question上使用第一个答案。使用sessionStorage生成ID后,可以使用ajax mayabe将其转发到C#后端,并将其保存在您的单例中。

请记住,这在IE11中不起作用。

答案 2 :(得分:0)

好的,我找到了一些解决方案。 我正在创建一个单例类,该类具有将更改的对象... 当我想更改对象的详细信息时,可以使用一种方法来执行此操作... 然后,我获得了所有WebApp的更新信息。 将在我需要指定对象详细信息的每种方法中进行更改。 例如:

public class InjectedSingleton
{
    public MySession CurrentSession{get;set;}

    public void SetSession(string sessionId)
    {
        CurrentSession = GetSessionById(sessionId);
    }
    public void NewSession()
    {
        CurrentSession = new MySession();
    }
}

public class DoClass
{
    private InjectedSingleton inj;
    public DoClass(InjectedSingleton inj)
    {
        this.inj = inj;
    }
    public void OpenNewTab(string sessionId)
    {
        inj.SetSession(sessionId);
    }
    public void JustShowSomething()
    {
        Show(inj.CurrentSession.Id);

    }      
}

现在,更新的会话是必需的会话,适用于当前用户在应用中的所有应用