2010-11-21 3 views
1

문자열로 객체를 만드는 사용자 정의 윈저 액티베이터를 작성하는 방법은 무엇입니까?

지금까지는 초기화가 필요하지 않았지만 이제는 IScheduledTask가 depand 될 일부 구성 요소가 있습니다. 생성자 주입을 통해.
클래스 이름과 동일한 이름의 인스턴스를 정의하는 방법이 있습니까? 나중에 resolve를 사용하여 모든 종속성을 해결할 예정입니까?
만약 내가 "SomeScheduledTask"매개 변수로 얻을 수있는이 일을 :

IScheduledTask task = (IScheduledTask)container.Resolve(typeName); // I know this is possible. The problem is the registration. 

내 문제를 해결하기 위해 이렇게 할 수 있습니다 :

container.Register(Component.For<IScheduledTask>().Named(t => t.Name).Activator<MyActivator>()) 

그리고 내 activator에서 뭔가를 할 this :

public class MyActivator : IComponentActivator 
{ 
    public object Create(CreationContext context) 
    { 
     string typeName = context.???; // How do I get the named instance name from here? 
     Assembly asm = Assembly.GetEntryAssembly(); 
     ObjectHandle oh = Activator.CreateInstance(asm.FullName, typeName); 

     IScheduledTask task = (IScheduledTask)oh.Unwrap(); 
     task.Execute(); 
    } 

    public void Destroy(object instance) 
    { 

    } 
} 

답변

2

만약 내가 제대로 이해하고, 문제는 당신이 사용됩니다 IScheduledTask에 대한 어떤 구현 유형을 미리 알 수 없다는 것입니다,의 o 당신은 그것을 정상적으로 등록 할 수 없습니다. 그렇다면 IComponentActivator는 사용할 올바른 확장 점이 아닙니다. 대신 ILazyComponentLoader을 시도하십시오.

을 수행하는 경우은 프로그램에서 사용할 수있는 가능한 IScheduledTask 구현을 알고 있습니다 (scan and register them normally).

+0

IScheduledTask 프로그램에서 사용할 수있는 정보를 알고 있는데 문제는 콘솔 매개 변수를 사용하여 런타임에 구체화 된 개체를 확인하고 있다는 것입니다. 그렇다면 정확히 무엇을 사용해야합니까? –

+0

@the_drow : 구성 요소를 정상적으로 등록하거나 구성 요소 이름으로 typename을 할당하거나, 또는 서비스 유형없이 등록하십시오. –

+0

@Mauricio Scheffer : 그래서 그것은 수동으로해야합니까? –

관련 문제