Jednym ze sposobów jest zainstalowanie repozytorium IRepositoryFactory, a następnie zarejestrowanie go. Rozwiązane typy mogą uzyskać fabrykę, a następnie wywołać jej metodę CreateAuthoringRepository. Można utworzyć przeciążenie o nazwie CreateAuthoringRepositoryForCurrentIdentity, jeśli jest to pożądane, lub zarejestrować zależność IIdentity fabryki od Unity.
Najprawdopodobniej po prostu wstrzyknęłabym fabrykę i opuścił metodę CreateAuthoringRepository, tak jak ją posiadasz, a następnie przekazuj klientom WindowsIdentity.GetCurrent(). W ten sposób tożsamość jest zawsze świeża i możesz kpić z fabryki do testowania.
Alternatywnie, można określić delegata z 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; }
}
Drukuje:
debug - resolving model
debug - calling factory
Constructing model with repository identity of System.Security.Principal.WindowsIdentity
To dla Unity 2.0. W przypadku wcześniejszych wersji zobacz StaticFactoryExtension.
Dzięki! pracował jak czar =) – burnt1ce
Idealny! To działa również dla mnie. –