37

私は今解決できない1つの問題に遭遇します。私は次のものを持っています:

UnityHelper.DefaultContainer.RegisterInstance(typeof(IMyInterface), "test", instance);

UnityHelper.DefaultContainerロードされた構成で Unity コンテナーを取得するためのヘルパーはどこにありますか。

ここでinstanceは のインスタンスとして登録しましたIMyInterface

どこでも(使用後しばらくして)このマッピングを削除したいと思います。まったく削除してください。どうすればそれができますか?

私が試してみました:

UnityHelper.DefaultContainer.Teardown(instance)

しかし、それは失敗し、次のコードはinstanceとにかく戻ります:

UnityHelper.DefaultContainer.ResolveAll<IMyInterface>()
4

6 に答える 6

11

それがあなたが探しているものだと思います。

var lifetimeManager = new TransientLifetimeManager();
UnityHelper.DefaultContainer.RegisterInstance(typeof(IMyInterface), "test", instance, lifetimeManager);
lifetimeManager.RemoveValue();
于 2010-04-24T20:05:02.943 に答える
8

Unityコンテナからのインスタンスの登録解除をどのように処理したかを次に示します

次のような追加/削除機能を実装する必要がありました。

public interface IObjectBuilder
{
    void AddInstance<T>(T instance);
    void RemoveInstance<T>(T instance);
}

実装を行うためのカスタム ライフタイム マネージャーを作成しました

public class ExplicitLifetimeManager :
    LifetimeManager
{
    object Value;

    public override object GetValue()
    {
        return Value;
    }

    public override void SetValue(object newValue)
    {
        Value = newValue;
    }

    public override void RemoveValue()
    {
        Value = null;
    }
}

最終的な実装は次のとおりです。

    Dictionary<object, ExplicitLifetimeManager> Instances = new Dictionary<object, ExplicitLifetimeManager>();

    public void AddInstance<T>(T instance)
    {
        ExplicitLifetimeManager e = new ExplicitLifetimeManager();
        Instances[instance] = e;
        Container.RegisterInstance(instance, e);
    }

    public void RemoveInstance<T>(T instance)
    {
        Instances[instance].RemoveValue();
        Instances.Remove(instance);
    }

カスタム ライフタイム マネージャーで removevalue を呼び出すと、インスタンスが登録解除される

于 2011-03-08T19:28:49.987 に答える
2

私は同じ課題を抱えており、実験した後、標準の ContainerControlledLifetimeManager を使用し、コンテナー インスタンスを削除するときに RemoveValue を呼び出すことで解決しました。インターフェイスを使用しておらず、オブジェクトにコンテナーが見つけて使用できるコンストラクターがある場合、lifetimeManager.RemoveValue() で破棄した後にインスタンスが再作成されることに注意してください。

[TestClass]
public class UnityContainerTest
{
    [TestMethod]
    public void RemoveFromContainer()
    {
        UnityContainer container = new UnityContainer();
        MyUnityMember member = new MyUnityMember(5);

        LifetimeManager lifetimeManager = new ContainerControlledLifetimeManager();
        container.RegisterInstance(member, lifetimeManager);

        var resolved = container.Resolve<MyUnityMember>();
        Assert.IsNotNull(resolved);

        lifetimeManager.RemoveValue();

        try
        {
            resolved = container.Resolve<MyUnityMember>();
            Assert.Fail(resolved + " is still in the container");
        }
        catch (ResolutionFailedException)
        {
        }
    }

    public class MyUnityMember
    {
        public MyUnityMember(int x)
        {
            I = x;
        }

        public int I { get; private set; }
    }
}
于 2012-11-13T13:40:54.450 に答える
1

Unityコンテナにオブジェクトを一時的に保存したいという同様の要件がありましたが、これは不可能である(または少なくとも簡単に可能である)ことがわかりました。Unity が簡単に利用できる一時保管場所を用意することが目的の場合は、一時保管サービスを作成します。

public class TemporaryStorageService : ITemporaryStorageService
{
    public void Deposit<T>(Object o, string key)
    {
        System.Windows.Application.Current.Properties[key] = o;
    }

    public T Withdraw<T>(string key)
    {   T o = (T)System.Windows.Application.Current.Properties[key];
        System.Windows.Application.Current.Properties.Remove(key);
        return o;
    }
}

サービスを Unity に登録します。次に、オブジェクトを保存する場合は Deposit メソッドを呼び出し、オブジェクトを削除する場合は Withdraw メソッドを呼び出します。詳細な説明はここにあります

于 2010-04-30T22:40:45.003 に答える