Один из способов заключается в том, чтобы RepositoryFactory реализовал IRepositoryFactory, а затем зарегистрировал это. Разрешенные типы могут получить фабрику, а затем вызвать ее метод CreateAuthoringRepository. При желании вы можете создать перегрузку с именем CreateAuthoringRepositoryForCurrentIdentity или зарегистрировать зависимость фабрики от IIdentity в Unity.
Я бы, вероятно, просто внедрил фабрику и оставил метод CreateAuthoringRepository таким, как он у вас, а затем попросил бы клиентов передать WindowsIdentity.GetCurrent (). Таким образом, идентичность всегда свежа, и вы можете издеваться над фабрикой для тестирования.
Кроме того, вы можете указать делегата с InjectionFactory:
void Main()
{
using (var container = new UnityContainer())
{
container.RegisterType<IAuthoringRepository>(
new InjectionFactory(c => CreateAuthoringRepository()));
Console.WriteLine("debug - resolving model");
var model = container.Resolve<Model>();
}
}
public IAuthoringRepository CreateAuthoringRepository()
{
Console.WriteLine("debug - calling factory");
return new AuthoringRepository
{ Identity = WindowsIdentity.GetCurrent() };
}
public class Model
{
public Model(IAuthoringRepository repository)
{
Console.WriteLine(
"Constructing model with repository identity of "
+ repository.Identity);
}
}
public interface IAuthoringRepository
{
IIdentity Identity { get; }
}
public class AuthoringRepository : IAuthoringRepository
{
public IIdentity Identity { get; set; }
}
Это печатает:
debug - resolving model
debug - calling factory
Constructing model with repository identity of System.Security.Principal.WindowsIdentity
Это для Unity 2.0. В более ранних версиях см. StaticFactoryExtension .