Pergunta

Eu tenho alguns serviços da web ASP.NET que compartilham uma classe auxiliar comum, eles só precisam instanciar uma instância de por servidor.É usado para tradução simples de dados, mas gasta algum tempo durante a inicialização, carregando coisas do arquivo web.config, etc. A classe auxiliar é 100% segura para threads.Pense nisso como uma biblioteca simples de chamadas de utilitários.Eu faria todos os métodos compartilhados na classe, mas quero carregar a configuração inicial do web.config. Implantamos os serviços da web no IIS 6.0 e usando um pool de aplicativos, com um Web Garden de 15 trabalhadores.

Declarei a classe auxiliar como uma variável privada compartilhada em Global.asax e adicionei uma propriedade Shared ReadOnly de carregamento lento como esta:

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

Eu tenho código de registro no construtor para MyHelperClass(), e mostra o construtor em execução para cada solicitação, mesmo no mesmo thread.Tenho certeza de que estou perdendo alguns detalhes importantes do ASP.NET, mas o MSDN não tem sido muito útil.

Eu tentei fazer coisas semelhantes usando ambos Application("Helper") e Cache("Helper") e ainda vi o construtor rodar com cada solicitação.

Foi útil?

Solução

Não é aconselhável usar o estado do aplicativo, a menos que seja absolutamente necessário; as coisas serão muito mais simples se você usar objetos por solicitação.Qualquer adição de estado às classes auxiliares pode causar todos os tipos de erros sutis.Use a coleção de itens HttpContext.Current e inicialize-a por solicitação.Um módulo VB faria o que você deseja, mas você deve ter certeza de não torná-lo com estado.

Outras dicas

Você pode colocar seu Helper no Application State.Faça isso em global.asax:

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

Você pode usar o Helper dessa forma:

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

Isso resulta em uma única instância da classe MyHelperClass que é criada no início do aplicativo e permanece no estado do aplicativo.Como a instância é criada em Application_Start, isso acontece apenas uma vez para cada instância HttpApplication e não por solicitação.

Já fiz algo assim em meu próprio aplicativo no passado e isso causou todos os tipos de erros estranhos.Cada usuário terá acesso aos dados de todos os demais na propriedade.Além disso, você pode acabar com um usuário no meio do uso e ser cortado porque está sendo solicitado por outro usuário.

Não, não está isolado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top