Ответ 1
Один из способов заключается в том, чтобы RepositoryFactory реализовал IRepositoryFactory, а затем зарегистрировал это. Решенные типы могут получить factory, а затем вызвать метод CreateAuthoringRepository. Вы можете создать перегрузку с именем CreateAuthoringRepositoryForCurrentIdentity, если хотите, или зарегистрировать зависимость IIdentity от factory с Unity.
Я бы просто ввел factory и оставил метод CreateAuthoringRepository таким, какой у вас есть, а затем клиенты передают WindowsIdentity.GetCurrent(). Таким образом, идентификация всегда свежая, и вы можете высмеивать factory для тестирования.
В качестве альтернативы вы можете указать делегата с 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.