工厂应该设置模型属性吗?

Pri*_*ERO 16 c# asp.net solid-principles

作为整体SOLID编程工作的一部分,我在基础框架API中创建了工厂接口和抽象工厂.

人们已经开始重载工厂的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; }
}
Run Code Online (Sandbox Code Playgroud)

更新 - 对于那些不熟悉SOLID原则的人,以下是其中一些原则:

单一责任原则
它规定每个对象应该只有一个责任,并且该责任应该由类完全封装

开放/封闭原则
这个原则的含义是当获得对需要添加到应用程序的功能的请求时,您应该能够在不修改旧类的情况下处理它,只需添加子类和新实现.

依赖倒置原则
它说你应该解耦你的软件模块.要实现这一点,您需要隔离依赖项.

总的来说:
我90%肯定我知道答案.但是,我想与已经使用SOLID的人进行一些很好的讨论.感谢您的宝贵意见.

更新 - 那么我认为SOLID工厂应该怎么做?

恕我直言SOLID工厂提供适当的对象实例......但这样做的方式隐藏了对象实例化的复杂性.例如,如果您有一个员工模型......您会要求工厂为您提供合适的模型.DataAccessorFactory将为您提供正确的数据访问对象,ValidatorFactory将为您提供正确的验证对象等.

例如:

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>();
Run Code Online (Sandbox Code Playgroud)

再举一个例子,我们会......

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);
Run Code Online (Sandbox Code Playgroud)

更新 - 为什么我坚持这种分离?

我认为隔离责任会使较小的物体,较小的单元测试,并增强可靠性和维护.我认识到它是以创建更多对象为代价的......但这就是SOLID工厂保护我的......它隐藏了收集和实例化所述对象的复杂性.

k.m*_*k.m 6

我说它坚持DRY原则,只要它是简单的值布线我不认为它是问题/违规.而不是拥有

var model = this.factory.Create();
model.Id = 10;
model.Name = "X20";
Run Code Online (Sandbox Code Playgroud)

散布在你的代码库周围,将它放在一个地方几乎总是更好.未来的合同变更,重构或新要求将更容易处理.

值得一提的是,如果这样的对象创建,然后立即属性设置为常见的,那么这是一个你的团队已经发展模式和开发者加入重载只是对这一事实的反应(值得注意的是,一个好的).引入API以简化此过程是应该做的.

而且,如果它缩小到简单的任务(就像在你的例子中),我会毫不犹豫地保持重载,特别是如果你经常注意到它.当事情变得更复杂时,它将成为发现新模式的标志,然后您应该采用其他标准解决方案(例如构建器模式).