2012-02-17 7 views
0

RegisterInstance을 사용하여 Dependency 특성을 사용하려고합니다. 내가 읽었습니다 RegisterInstance을 사용하는 경우 인스턴스에 BuildUp 메서드를 사용해야합니다. 불행히도 그것은 내 코드에서 작동하지 않습니다. Alarm 속성은 해결되지 않습니다. RegisterInstance없이 코드를 사용하면 모든 것이 정상이지만 사용하려면 RegisterInstance이 필요합니다. 내가 놓친 게 있니?BuildUp이 종속성을 해결하지 못함

편집

var container = new UnityContainer(); 
container.RegisterType<IAlarm, Alarm>(); 

ICar car = new Car(); 
container.RegisterInstance<ICar>(car); 
var carFromContainer = container.BuildUp<ICar>(container.Resolve<ICar>()); 
var alarm = carFromContainer.Alarm; 

public interface ICar 
{ 
    IAlarm Alarm { get; set; } 
} 

public class Car : ICar 
{ 
    private IAlarm _alarm; 

    [Dependency] 
    public IAlarm Alarm 
    { 
     get { return _alarm; } 
     set { _alarm = value; } 
    } 
} 

public interface IAlarm 
{ 
    void Launch(); 
} 

public class Alarm : IAlarm 
{ 
    public void Launch() 
    { 
     Console.WriteLine("Alarm !"); 
    } 
} 

오래 된 예입니다

var container = new UnityContainer(); 
container.RegisterType<IAlarm, Alarm>(); 
ICar car = new Car(); 
container.RegisterInstance<ICar>(car); 

//container.RegisterType<ICar, Car>(); 

var client = new Client(container); 
var alarm = client.Car.Alarm; 
client.Car.Alarm.Launch(); 

public class Client 
{ 
    public ICar Car { get; set; } 
    public Client(UnityContainer container) 
    { 
     //Car = container.Resolve<ICar>(); 
     Car = container.BuildUp<ICar>(container.Resolve<ICar>()); 
    } 
} 


public interface ICar 
{ 
    IAlarm Alarm { get; set; } 
} 

public class Car : ICar 
{ 
    private IAlarm _alarm; 

    [Dependency] 
    public IAlarm Alarm 
    { 
     get { return _alarm; } 
     set { _alarm = value; } 
    } 
} 

public interface IAlarm 
{ 
    void Launch(); 
} 

public class Alarm : IAlarm 
{ 
    public void Launch() 
    { 
     Console.WriteLine("Alarm !"); 
    } 
} 

답변

2

나는 당신의 샘플 코드를 이해하지 않습니다. Car을 새로 작성하여 컨테이너에 등록하십시오. 그런 다음 컨테이너에 IAlarm을 구현 클래스 Alarm에 매핑하도록 지시합니다. 그런 다음 컨테이너를 귀하의 Client에 주입하십시오.이 컨테이너는 강력하게 권장하지 않습니다. DI 컨테이너는 응용 프로그램의 Composition root 외부에서 절대로 참조되어서는 안됩니다. 그리고 나서 (ab)는 ICar을 해결하고 속성에 값을 삽입하기 위해 ServiceLocator (anti-pattern in modern application architecture으로 간주 됨)로 컨테이너를 사용합니다.

내가 직면 한 기술 문제에 대한 해결책을 찾는 대신 디자인을 다시 생각해 보는 것이 좋습니다.


UPDATE

ICar에 대한 인터페이스 정의를 변경하고 거기 DependencyAttribute를 넣고 그것을 작동

.

하지만 그 방법을 추천 할 수도 없습니다. DI attributes should not polute your code.

+0

세바스찬, 너는 옳다. 나는 너에게 동의한다. 그러나 이것은 가능한 한 쉬운 예일뿐입니다. 제 실제 응용 프로그램에서 여러분이 열거 한 우수 사례를 따릅니다. 나는 clearier 예를 제공하기 위해 내 게시물을 편집했습니다. – user278618

+0

@ user278618 내 대답은 –

+0

으로 업데이트되었습니다. 작동하지만 :) 귀하의 링크가 더 좋습니다. – user278618

관련 문제