2013-02-22 6 views
0

에 해결 등록 열려있는 제네릭에 대리인을 제공 :내가이 같은 인터페이스를 가지고 Autofac

ICreator<T> {} 

내가 사용자가이 같은 의존성을 해결하게됩니다 싶지 :

var creator = container.Resolve<ICreator<IUser>>(); 

요령은 ICreator<T>에 대한 구체적인 유형의 사용자 정의 생성을 수행 할 수 있기를 원합니다. 필자의 경우에는 에 TConcrete을 사용하는 일반 형식을 사용하는 생성자가 있습니다. 규칙에 따라 TConcrete의 유형에 이 ICreator에 정의되어 있어야하지만, 인스턴스를 만들려면 위임자 인 RegisterGeneric이 필요하지 않은 것으로 보입니다.

어쩌면 이것은 Autofac에 존재하며 누락 되었습니까? 모든 통찰력이 인정 될 것입니다 - TIA.

답변

0

콘크리트 유형에 대해 특정 작성자를 등록 할 수 있습니다. 샘플 :

public interface ICreator<T> 
{ 
    void WriteName(); 
} 

public class Creator<T> : ICreator<T> 
{ 
    public void WriteName() 
    { 
     Console.WriteLine("I'm standard creator: " + typeof(T).FullName); 
    } 
} 

public class CustomIntCreator : ICreator<int> 
{ 
    public void WriteName() 
    { 
     Console.WriteLine("I'm custom int creator"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ContainerBuilder cb = new ContainerBuilder(); 
     cb.RegisterGeneric(typeof (Creator<>)).As(typeof (ICreator<>)); 
     cb.RegisterType<CustomIntCreator>().As<ICreator<int>>(); 
     var container = cb.Build(); 

     var intCreator = container.Resolve<ICreator<int>>();    
     var standardCreator = container.Resolve<ICreator<double>>(); 
     intCreator.WriteName(); //writes "I'm custom int creator" 
     standardCreator.WriteName(); //writes "I'm standard creator: System.Double" 

     Console.ReadLine(); 
    } 
} 
+0

나는 이것이 내가 찾고있는 것이라고 생각하지 않는다. 내가 원하는 것은'ICreator '을 지정하고'Creator '이'ICreator '을 구현하는'Creator '을 반환하는 것입니다. ICreator 작성자 = 새 작성자 () - 수동으로 코드에서이 작업을 수행 할 수 있지만 Autofac에서 이러한 종류의 구성을 등록 할 수있는 방법을 찾을 수 없습니다. – JasonBock

+0

작동하는 한 가지는'OnActivating'을 후크하고'ReplaceInstance'를 호출하는 것입니다. 그것은 제가 찾고있는 것보다 낫지 만, 제가 대체 할 수있는'RegisterGeneric'에서 제공하는 제네릭 타입의 인스턴스를 생성한다는 점에서 작은 부작용이 있습니다. – JasonBock

0

내가 필요 달성하기 위해 OnActivatingReplaceInstance 필요한 후크입니다 사용은 : Autofac가 구성된 제네릭 형식의 인스턴스를 생성하므로

builder.RegisterGeneric(typeof(FakeCreator<>)).As(typeof(ICreator<>)).OnActivating(args => 
    { 
     // ... 
     args.ReplaceInstance(new Creator<...,...>()); 
    }); 

이건 완벽한 건 아니지만, 그것을 작동합니다.

관련 문제