Codice di refactoring per evitare l’anti-pattern

Ho un progetto BusinessLayer che ha il seguente codice. L’object dominio è FixedBankAccount (che implementa IBankAccount).

  1. Il repository viene creato come proprietà pubblica dell’object dominio e viene creato come membro dell’interfaccia. Come rifattorizzarlo in modo che il repository non sia un membro dell’interfaccia ?

  2. L’object dominio (FixedBankAccount) utilizza il repository direttamente per memorizzare i dati. Si tratta di una violazione del principio di responsabilità unica? Come correggerlo?

Nota: il modello di repository è implementato utilizzando LINQ to SQL.

MODIFICARE

Il codice riportato di seguito è un approccio migliore? https://codereview.stackexchange.com/questions/13148/is-it-good-code-to-satisfy-single-responsibility-principle

CODICE

public interface IBankAccount { RepositoryLayer.IRepository AccountRepository { get; set; } int BankAccountID { get; set; } void FreezeAccount(); } 

 public class FixedBankAccount : IBankAccount { private RepositoryLayer.IRepository accountRepository; public RepositoryLayer.IRepository AccountRepository { get { return accountRepository; } set { accountRepository = value; } } public int BankAccountID { get; set; } public void FreezeAccount() { ChangeAccountStatus(); } private void SendEmail() { } private void ChangeAccountStatus() { RepositoryLayer.BankAccount bankAccEntity = new RepositoryLayer.BankAccount(); bankAccEntity.BankAccountID = this.BankAccountID; accountRepository.UpdateChangesByAttach(bankAccEntity); bankAccEntity.Status = "Frozen"; accountRepository.SubmitChanges(); } } 

 public class BankAccountService { RepositoryLayer.IRepository accountRepository; ApplicationServiceForBank.IBankAccountFactory bankFactory; public BankAccountService(RepositoryLayer.IRepository repo, IBankAccountFactory bankFact) { accountRepository = repo; bankFactory = bankFact; } public void FreezeAllAccountsForUser(int userId) { IEnumerable accountsForUser = accountRepository.FindAll(p => p.BankUser.UserID == userId); foreach (RepositoryLayer.BankAccount repositroyAccount in accountsForUser) { DomainObjectsForBank.IBankAccount acc = null; acc = bankFactory.CreateAccount(repositroyAccount); if (acc != null) { acc.BankAccountID = repositroyAccount.BankAccountID; acc.accountRepository = this.accountRepository; acc.FreezeAccount(); } } } } 

 public interface IBankAccountFactory { DomainObjectsForBank.IBankAccount CreateAccount(RepositoryLayer.BankAccount repositroyAccount); } 

 public class MySimpleBankAccountFactory : IBankAccountFactory { public DomainObjectsForBank.IBankAccount CreateAccount(RepositoryLayer.BankAccount repositroyAccount) { DomainObjectsForBank.IBankAccount acc = null; if (String.Equals(repositroyAccount.AccountType, "Fixed")) { acc = new DomainObjectsForBank.FixedBankAccount(); } if (String.Equals(repositroyAccount.AccountType, "Savings")) { acc = new DomainObjectsForBank.SavingsBankAccount(); } return acc; } } 

LETTURA:

  1. DDD – Transizione stato quadro

  2. https://codereview.stackexchange.com/questions/13148/is-it-good-code-to-satisfy-single-responsibility-principle

  3. L’uso del “Principio della singola responsabilità” costringe i miei contenitori ad avere incarichi pubblici

  4. https://softwareengineering.stackexchange.com/questions/150760/single-responsibility-principle-how-can-i-avoid-code-fragmentation