Unityコンテナからすでに登録されているタイプを削除するか、少なくとも既存のインターフェイス/タイプマッピングを別のものに置き換える簡単な方法があるのだろうか. 別のクラス タイプをインターフェイスにマップするだけで十分で、古いタイプは上書きされますか?
これは頻繁に起こるべきではありません。実際にはほとんどありませんが、他の部分に影響を与えずに、あるインターフェイスを実装するサービスを別のサービスに置き換えたい場合があります。
Unityコンテナからすでに登録されているタイプを削除するか、少なくとも既存のインターフェイス/タイプマッピングを別のものに置き換える簡単な方法があるのだろうか. 別のクラス タイプをインターフェイスにマップするだけで十分で、古いタイプは上書きされますか?
これは頻繁に起こるべきではありません。実際にはほとんどありませんが、他の部分に影響を与えずに、あるインターフェイスを実装するサービスを別のサービスに置き換えたい場合があります。
Unity 2 では、ある登録を別の登録に置き換えようとしている場合、元の登録に含まれていた場合、新しい登録で From タイプと To タイプの両方を指定する必要があります。
たとえば、次の場合:
public interface IService
{
void DoSomething();
}
public class SomeService : IService
{
public void DoSomething();
}
public class AnotherService : IService
{
public void DoSomething();
}
SomeService を次のように登録します。
container.RegisterType<IService, SomeService>();
次に、システムの別の部分が IService 登録をオーバーライドして AnotherService を解決したい場合は、次のように登録する必要があります。
container.RegisterType<IService, AnotherService>();
それは非常に簡単に思えますが、AnotherService をファクトリで作成する必要があるとき、私はそれに夢中になりました。
container.RegisterType<IService>(new InjectionFactory(x =>
{
// this would be some complicated procedure
return new AnotherService();
}));
この場合でも、SomeService を取得できます。期待どおりに AnotherService を取得するには、 TTo タイプを指定する必要があります。
container.RegisterType<IService, AnotherService>(new InjectionFactory(x =>
{
return new AnotherService();
}));
Web キャスト (msdn webcasts search for unity を参照) を聞くと、最後に wins シナリオで登録された型が置き換えられます。したがって、構成を使用してコンテナーをロードする場合は、コードを使用して、同じタイプのコードを登録します (その逆も真です)。
いつでもコンテナを再作成して新しいタイプを登録することができます。これを何度も繰り返す必要がある場合は、フレームワークの設計を再検討する必要があると思います。
私は Unity をチェックアウトしていないので、間違っているかもしれませんが、あなたがやろうとしていることは不可能だと思います。最初にタイプを検出してからアプリを実行します。ストアは読み取り専用であり、変更されることはないため、インスタンスに挿入するインスタンスを確認するためにアクセスごとにタイプ ストアをロックする必要がないためです。