人们已经开始过载工厂的Create方法。问题是人们正在使用模型属性来重载Create方法(因此期望工厂填充它们)。
在我看来,属性设置不应该由工厂完成。我错了吗?
public interface IFactory
{
I Create<C, I>();
I Create<C, I>(long id); //<--- I feel doing this is incorrect
IFactoryTransformer Transformer { get; }
IFactoryDataAccessor DataAccessor { get; }
IFactoryValidator Validator { get; }
}
更新 - 对于不熟悉SOLID原则的人,以下是其中几个原则:
单一职责原则
它指出每个对象都应该有一个单一职责,并且该职责应完全封装在类中。
开闭原则
这个原则的意思是,当你收到需要添加到应用程序中的功能请求时,你应该能够处理它,而不需要修改旧的类,只需添加子类和新的实现。
依赖倒置原则
它说你应该解耦你的软件模块。为了实现这一点,你需要隔离依赖关系。
总体而言:
我90%确定我知道答案。然而,我想听听那些已经使用SOLID的人的好的讨论。谢谢你们宝贵的意见。
更新 - 那么我认为一个SOLID工厂应该做什么?
例如:
var employee = Factory.Create<ExxonMobilEmployee, IEmployee>();
var dataAccessorLdap = Factory.DataAccessor.Create<LDAP, IEmployee>();
var dataAccessorSqlServer = Factory.DataAccessor.Create<SqlServer, IEmployee>();
var validator = Factory.Validator.Create<ExxonMobilEmployee, IEmployee>();
取这个例子进一步说明,我们会...
var audit = new Framework.Audit(); // Or have the factory hand it to you
var result = new Framework.Result(); // Or have the factory hand it to you
// Save your AuditInfo
audit.username = 'prisonerzero';
// Get from LDAP (example only)
employee.Id = 10;
result = dataAccessorLdap.Get(employee, audit);
employee = result.Instance; // All operations use the same Result object
// Update model
employee.FirstName = 'Scooby'
employee.LastName = 'Doo'
// Validate
result = validator.Validate(employee);
// Save to SQL
if(result.HasErrors)
dataAccessorSqlServer.Add(employee, audit);
更新 - 那么为什么我坚持这种分离呢?
我认为将职责分离可以使对象更小,单元测试更小,并增强可靠性和维护性。我意识到这样做会产生更多的对象成本...但这就是SOLID工厂保护我的方式...它隐藏了收集和实例化这些对象的复杂性。
id
传递给Create
方法违反了哪个SOLID原则?SPR?”翻译为中文。哪个SOLID原则被破坏了?Liskov替换原则(LSP)。 - Ilya IvanovI
),而你团队中的其他人则将你的工厂视为构建器或存储库(外观模式)。如果你的意图是让工厂只“new”出一个对象,你可能需要更清楚地记录或以其他方式向你的团队传达这一点。 - Joseph Yaduvanshi