Sto lavorando in un codebase in C # che è stato scritto in gran parte da un ex sviluppatore e questo pattern è ampiamente utilizzato ...
public class AuditInserter
{
public static void Insert(
DataContext dataContext,
Person person,
AuditableAction action)
{
return
new AuditInserter(
dataContext,
person)
.InsertAudit(action);
}
private AuditInserter(
DataContext dataContext,
Person person)
{
_dataContext = dataContext;
_person = person;
}
private readonly _dataContext;
private readonly _person;
private void InsertAudit(AuditableAction action)
{
_dataContext.AuditTable.Insert(_person, action);
}
}
// Consuming object
public class MainProgram
{
public static void Main()
{
AuditInserter.Insert(
new DataContext,
new Person,
new AuditableAction);
}
}
Il costruttore è privato e la costruzione dell'oggetto è gestita dal metodo statico. Si noti che questo non è un esempio del modello singleton: l'oggetto non contiene un riferimento a un'istanza statica di se stesso.
C'è qualche vantaggio in questo design? Sarebbe la mia naturale inclinazione a progettarlo in questo modo:
public class AuditInserter
{
public AuditInserter(
DataContext dataContext,
Person person)
{
_dataContext = dataContext;
_person = person;
}
private readonly _dataContext;
private readonly _person;
public void Insert(
AuditableAction action)
{
return InsertAudit(action);
}
private void InsertAudit(AuditableAction action)
{
_dataContext.AuditTable.Insert(_person, action);
}
}
// Consuming object
public class MainProgram
{
public static void Main()
{
new AuditInserter(
new DataContext,
new Person)
.Insert(
new AuditableAction);
}
}
Sono dispiaciuto di seguire ciecamente questo schema esistente senza capire quali benefici offre (se ce ne sono).
Il codice è in C # ma questo problema non è specifico per C #.