2011-09-27 11 views
28

Wiem, że Unity można skonfigurować do używania konstruktora klasy do tworzenia instancji klasy (jak poniżej), ale to nie jest to, czego chcę.Jak tworzyć obiekty za pomocą statycznej metody fabularnej?

container.RegisterType<IAuthoringRepository, AuthoringRepository>(); 

chciałbym skonfigurować Jedności użyć metody fabryki z przekazanym jako parametr tożsamości okien (tj: RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent())) przy rozwiązywaniu typ IAuthoringRepository. Jak mam to zrobic?

Odpowiedz

46

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.

+1

Dzięki! pracował jak czar =) – burnt1ce

+1

Idealny! To działa również dla mnie. –

Powiązane problemy