Если вы хотите удалить зависимость фабрики от контейнера, вам придется заранее подключить все зависимости.
Элегантным способом сделать это была бы поддержка Unity для автоматических фабрик..
Вы можете определить свою фабрику следующим образом:
public class AuditOperationLogWriterFactory
{
private Dictionary<Operation, Func<IAuditOperationLogWriter>> auditCreator =
new Dictionary<Operation, Func<IAuditOperationLogWriter>>();
public AuditOperationLogWriterFactory(Func<AuditInsertLogWriter> insert,
Func<AuditUpdateLogWriter> update)
{
auditCreator[Operation.Insert] = insert;
auditCreator[Operation.Update] = update;
}
public IAuditOperationLogWriter Create(Operation operation)
{
if (auditCreator.ContainsKey(operation))
{
return auditCreator[operation]();
}
return null;
}
}
И затем вы можете просто разрешить фабрику, и Unity должна соединить зависимости, и создание объекта откладывается до времени выполнения (на основеконтекст).Если они сложные, вам, возможно, придется помочь через конфигурацию (файл конфигурации, код или атрибуты).
IUnityContainer container = new UnityContainer();
var factory = container.Resolve<AuditOperationLogWriterFactory>();
var logWriter = factory.Create(Operation.Insert);