我有一个复杂的实体 ( Message
),它有一个庞大的构造函数 (13 个参数),其中一些参数又是实体 ( Verb
)。
有很多事情我需要另一个实体的存储库(例如某些默认值)。
使用 IoC 并保持代码干净/最佳实践的好方法是什么?
简化代码(我将默认动词列表作为由静态构造函数亲自构造的静态对象,这是我的 Message 实体需要某种 IRepositry 的最简单的例子)。
private static IVerbRepository verbRepository;
static Message()
{
using (IKernel kernel = new StandardKernel())
{
verbRepository = kernel.Get<IVerbRepository>();
}
}
public Message(int id, string precis,
DateTime created, DateTime validTo,
PriorityType priority, Source source, SID createdBy,
string content = null, string helpText = null,
DateTime? validFrom = null, bool emailOnExpiry = false,
IEnumerable<SID> targetUsers = null,
IOrderedEnumerable<MessageVerb> verbs = null) : base(id)
{
Verbs = verbs ??
new List<MessageVerb>
{
new MessageVerb(
verbRepository.GetByName("Acknowledge"), true,
string.Empty)
}.OrderBy(x => x.IsDefault);
Precis = precis;
Created = created;
ValidTo = validTo;
Priority = priority;
Source = source;
CreatedBy = createdBy;
Content = content;
HelpText = helpText;
ValidFrom = validFrom;
EmailOnExpiry = emailOnExpiry;
TargetUsers = targetUsers;
}
常见的做法似乎是在构造函数中添加一个额外的参数。我不明白这样更好吗?这意味着每次您要创建消息时,都需要编写代码来检索存储库。假设您将其包装在工厂中,那么允许(逻辑上如果不是实际上)为消息实体拥有不同的存储库是没有意义的?
编辑 1
基于第一个解决方案,代码会这样,
public Message(IVerbRepository verbRepository ...) { }
在同一域程序集中的其他地方
public MessageService
{
private IVerbRepository VerbRepository {get; set;}
public static IOrderedEnumerable<MessageVerb> DefaultVerb {get;}
}
在我的 DDD 之外更高(假设我的网络服务接受创建的消息)
public class MessageWebService
{
private static IVerbRepository _verbRepository;
public void AddMessage(some parameters)
{
var message = new Message(_verbRepository, ...);
}
}