Last active
December 8, 2024 14:00
-
-
Save franreyes/9e0e01e4c7e0a4b60f848c8b9b8745f0 to your computer and use it in GitHub Desktop.
Example extract and override factory method
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class FileTransactionsRepository : ITransactionsRepository | |
{ | |
// more code... | |
} | |
class Account | |
{ | |
private ITransactionsRepository _transactionsRepository; | |
public Account() | |
{ | |
var reader = new ModelReader(Config.TransactionsFileLocation); | |
var persister = new XmlStore(Config.TransactionsFileLocation); | |
this._transactionsRepository = new FileTransactionsRepository(reader, persister); | |
// more code... | |
} | |
// more code... | |
} | |
////////////////////////////////////////////// | |
// After extracting the factory method, | |
// you can apply override the factory method | |
class Account | |
{ | |
private ITransactionsRepository _transactionsRepository; | |
public Account() | |
{ | |
// extracted a factory method | |
this._transactionsRepository = CreateTransactionsRepository(); | |
// more code... | |
} | |
// factory method | |
private ITransactionsRepository CreateTransactionRepository() | |
{ | |
var reader = new ModelReader(Config.TransactionFile); | |
var persister = new XmlStore(Config.TransactionFile); | |
return new FileTransactionsRepository(reader, persister); | |
} | |
// more code... | |
} | |
////////////////////////////////////////////// | |
// After applying Subclass & Override Factory Method | |
class Account | |
{ | |
private ITransactionsRepository _transactionsRepository; | |
public Account() | |
{ | |
this._transactionsRepository = CreateTransactionsRepository(); | |
// more code... | |
} | |
// made protected for testing :( | |
protected virtual ITransactionsRepository CreateTransactionRepository() | |
{ | |
var reader = new ModelReader(Config.TransactionFile); | |
var persister = new XmlStore(Config.TransactionFile); | |
return new FileTransactionsRepository(reader, persister); | |
} | |
// more code... | |
} | |
////////////////////////////////////////////// | |
class ForTestingAccount : Account | |
{ | |
protected override ITransactionsRepository CreateTransactionRepository() | |
{ | |
return new FakeTransactionRepository(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment