2012-02-17 24 views
0

RegisterInstanceを使用してDependency属性を使用しようとしています。私はRegisterInstanceを使用する場合は、インスタンス上でBuildUpメソッドを使用する必要があります。残念ながら、私のコードでは動作しません。 Alarmプロパティは解決されません。 RegisterInstanceを使わずにコードを使用すると、すべては問題ありませんが、RegisterInstanceが必要です。私は何かが恋しいですか?BuildUpで依存関係が解決されない

EDIT

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

セバスチャン、あなたは絶対に正しいです。仰るとおりです。しかし、これは可能な限り簡単な例です。私の実際のアプリケーションでは、あなたがリストした良い練習に従います。私は、より明確な例を与えるために私の投稿を編集しました。 – user278618

+0

@ user278618私は自分の答えを –

+0

に更新しました。 – user278618

関連する問題