1
resposta

Implementação do State com banco de dados

Fiquei na duvida em relação a implementação desse padrão em uma API ASP.NET, seria de grande ajuda para sanar algumas tratativas que realizo diariamente no trabalho, porém estou na seguinte duvida

Imaginando a tabela seguinte

+----+------------+---------+

| ID | Title | State |

+----+------------+---------+

| 1 | Blog Post 1| Published |

| 2 | Blog Post 2| Draft |

| 3 | Blog Post 3| Archived |

+----+------------+---------+

e essa possivel implementação

public class BlogPost { public int ID { get; set; } public string Title { get; set; } public IPostState State { get; set; }

public void LoadStateFromDatabase(string state)
{
    // Instantiate the appropriate Concrete State class based on the retrieved state
    switch (state)
    {
        case "Draft":
            State = new DraftState();
            break;
        case "Published":
            State = new PublishedState();
            break;
        case "Archived":
            State = new ArchivedState();
            break;
        default:
            throw new InvalidOperationException("Invalid state");
    }
}

// Other methods and properties for the BlogPost class

}

ou até mesmo com um padrão de Factory,

cairia no mesmo problema de ter uma cadeia de cases/If onde dependendo do dados extraido do banco eu teria que setar a seguinte classe, e nesse caso sempre que houver um novo state cai no mesmo problema que o proprio design pattern propoe resolver,

entendo que com a classe instanciada eu reduziria muito a cadeia de ifs e poderia trazer uma serie de comportamentos que com ifs ficaria impossivel, mas ha alguma forma de contornar esse caso de para cada state ter que fazer um if ou case e instanciar a classe ?

1 resposta

Olá Gabriel

Entendo sua preocupação em relação à implementação do padrão State em uma API ASP.NET e a necessidade de evitar uma cadeia de ifs ou cases para instanciar as classes de estado. Felizmente, existem algumas abordagens que podem ajudar a contornar esse problema.

Uma opção é utilizar um padrão de Factory, como você mencionou. Nesse caso, você pode criar uma fábrica de estados que seja responsável por instanciar a classe de estado apropriada com base no estado recuperado do banco de dados. Dessa forma, você não precisaria de uma cadeia de ifs ou cases no BlogPost, mas sim na fábrica de estados.

Por exemplo, você poderia ter uma classe StateFactory que tenha um método CreateState que recebe o estado como parâmetro e retorna a instância apropriada da classe de estado. Essa fábrica pode ser injetada no construtor do BlogPost ou ser acessada através de uma propriedade estática.

Aqui está um exemplo de como a fábrica de estados poderia ser implementada:

public class StateFactory
{
    public IPostState CreateState(string state)
    {
        switch (state)
        {
            case "Draft":
                return new DraftState();
            case "Published":
                return new PublishedState();
            case "Archived":
                return new ArchivedState();
            default:
                throw new InvalidOperationException("Invalid state");
        }
    }
}

E então, no BlogPost, você poderia ter um método LoadStateFromDatabase que utiliza a fábrica de estados para criar a instância apropriada da classe de estado:

public void LoadStateFromDatabase(string state)
{
    State = stateFactory.CreateState(state);
}

Dessa forma, você evita a cadeia de ifs ou cases no BlogPost e centraliza a responsabilidade de criação das instâncias de estado na fábrica.

Espero que essa abordagem seja útil para você! Se tiver mais alguma dúvida, é só me dizer. Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software