Pergunta

Estou apenas começando portar um aplicativo para ASP.net MVC e eu temos um estado do aplicativo realização objeto (ele mantém o controle de certos processos em execução na máquina, iniciar e parar quando necessário, e enviar / receber mensagens MSMQ).

Onde devo manter este objeto? Na minha aplicação atual (com base no HttpListener) é um solteirão, no entanto eu sei singletons tornar o teste difícil. Seria difícil para zombar ou testar este objeto, pelo menos no contexto da aplicação MVC si mesmo, e tem seu próprio conjunto de testes fora da aplicação de qualquer maneira. No entanto, podem precisar de ser substituído por um stub para o teste.

O objeto precisa ser disponibilizados a um número de controladores. Onde devo guardar este objeto e como eu deveria torná-lo disponível para os controladores? Eu nunca vi um caso como este descrito em qualquer exemplos ASP.net MVC eu vi.

UPDATE:

Eu acho que preciso de explicar por que não posso armazenar esses dados em um banco de dados. Em primeiro lugar, devo explicar o que o aplicativo faz:

A aplicação serve imagens que são geradas dinamicamente por um número de "motores", que são os processos em execução no servidor, comunicadas à via MSMQ. Vamos chamar o objeto que eu estou fazendo a pergunta sobre o EngineManager. O processo é algo como isto:

  1. Os postos cliente uma solicitação XML para o servidor, dando o nome de "motor" para ser usado, bem como uma série de parâmetros que descrevem a imagem.
  2. As aplicativo verifica o EngineManager para ver se esse motor está funcionando. Se não, ele começa-lo.
  3. As mensagens de aplicação de uma mensagem MSMQ para o motor e aguarda a resposta.
  4. O aplicativo envia a parte de trás imagem gerada para o cliente.
  5. Se em algum momento os fecha motor para baixo ou falha, o aplicativo deve estar ciente de que, para que possa ser reiniciado no próximo pedido nesse motor.
  6. Quando os fecha aplicação para baixo, todos os motores são também desligado.

Existem vários controladores que lidam com estes pedidos, cada um fazendo um trabalho um pouco diferente. Todos eles precisam se comunicar com o mesmo EngineManager, como ele também precisa, em determinadas situações sincronizar o acesso a outros recursos.

Como você pode ver, não é o seu servidor web típico lastreados em banco de dados.

Foi útil?

Solução

Se você quiser esse objeto para estar disponível a todos os utilizadores, ou seja, não é específica sessão, você pode olhar para armazená-lo no estado do aplicativo:

http://msdn.microsoft.com/ en-us / library / bf9xhdz4 (VS.71) .aspx

No entanto, o estado do aplicativo tem várias desvantagens, como listados na página ligada acima, para se certificar esses problemas não afetam você antes de ir por esse caminho. Em boi geral eu limpo a partir de dados estaduais e Application Store applciation em um backend DB. Como você não quer ir por este estado do aplicativo rota pode ser OK para você.

Outras dicas

Você deve passar o objeto para o construtor de cada instância Controller, e os métodos de ação do controlador todos devem usar a instância do objeto passado para o construtor de instância Controller.

O ControllerFactory padrão que vem com o ASP.NET MVC não vai permitir que você faça isso. No entanto, existem estruturas addon livres (o que eu gosto é Autofac) que não permitem esse estilo de programação.

Mantenha seus dados de aplicativo no banco de dados e aceder a este por camada de modelo. Cliente sessão keep ID única.

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