2011-09-27 18 views
28

Sé que Unity se puede configurar para usar un constructor de clase para crear una instancia de una clase (como a continuación) pero eso no es lo que quiero.¿Cómo crear objetos utilizando un método de fábrica estático?

container.RegisterType<IAuthoringRepository, AuthoringRepository>(); 

me gustaría configurar la Unidad de utilizar un método de fábrica con la identidad ventanas pasado como parámetro (es decir: RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent())) al resolver un tipo de IAuthoringRepository. ¿Cómo hago esto?

Respuesta

46

Una forma es que RepositoryFactory implemente IRepositoryFactory, luego registre eso. Los tipos resueltos pueden obtener una fábrica y luego llamar a su método CreateAuthoringRepository. Puede crear una sobrecarga llamada CreateAuthoringRepositoryForCurrentIdentity si lo desea, o registrar una dependencia de IIdentity de la fábrica con Unity.

Probablemente solo inyecte una fábrica y abandone el método CreateAuthoringRepository como lo tiene, luego haga que los clientes pasen WindowsIdentity.GetCurrent(). De esa manera, la identidad siempre es fresca y puedes burlarte de la fábrica para probarla.

Alternativamente, puede especificar un delegado con 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; } 
} 

Esta impresora:

debug - resolving model 
debug - calling factory 
Constructing model with repository identity of System.Security.Principal.WindowsIdentity

Eso es para la Unidad 2.0. Con versiones anteriores, vea StaticFactoryExtension.

+1

Gracias! funcionó como un encanto =) – burnt1ce

+1

¡Perfecto! Esto también funciona para mí. –

Cuestiones relacionadas