3

クラスの 1 つに注入する必要がある依存関係があります。この依存関係は のライフスタイルになりTransientます。次に、 type の依存関係がありTypeます。この型は、元のクラスの型である必要があります。どうすればこの登録を行うことができるか、誰かが知っているかどうか疑問に思っていました.

例を参照してください:

public interface ICustomer
{
    .....
}

public class Customer : ICustomer
{
    public Customer(IRegister register)
    { .... }
}

public interface IRegister
{
    .....
}

public class Register
{
    public Register(Type partentType)
    { .... }
}

public class TestExample
{
    public static void TestMe()
    {
        //If i was creating all this manually it would look
        //   something like this
        IRegister myRegister = new Register(typeof(Customer));
        ICustomer myCustomer = new Customer(myRegister);
    }
}

Container.Resolveこれで、必要なときにいつでも電話して、手動でCustomer注入できることがわかりました。RegisterしかしRegister、ほとんどのクラスに注入する必要があるため、これは実際には実現可能ではありません。したがって、configまたはを介してそれを行う方法が必要container.Registerです。

4

4 に答える 4

1

私が見ることができる最も簡単な解決策は、それを次のように変更することです

public interface IRegister<TParent> { ... }
public class Register<TParent> : IRegister<TParent>
{
    public Register() { ... }
}

public class Customer : ICustomer
{
    public Customer(IRegister<Customer> register) { .... }
}

そして、IRegister をオープン ジェネリック クラスとして登録します。

于 2008-11-30T21:42:35.870 に答える
0

レジスターとは正確には何をするものですか?顧客オブジェクトが内部でレジスタを使用することはありますか?

どの DI コンテナーを使用しているかはわかりませんが、Windsor を使用していると仮定すると、カスタム機能を使用してコンポーネントの作成をインターセプトし、そこでレジスターとやり取りすることができます。そうすれば、顧客クラスにレジスターをパラメーターとして持たせる必要さえありません。

于 2008-10-27T14:12:39.230 に答える
0

あなたが達成しようとしていることが完全にはわかりませんが、代わりにコードを書き直して、次のことを行っている可能性があります。

public interface IRegister{
    RegisterResult MyMethod(object thing);
}

したがって、インスタンスをレジスターに渡すと、型をコンストラクターに渡す必要がなくなり、引き続き DI コンテナーを使用できます。これが理にかなっていることを願っています...

于 2008-10-27T03:50:19.127 に答える
-1

私はそれを考えましたが、それは親オブジェクトがこの小さな実装の癖について知る必要があることを意味します. したがって、強制できなくなった依存関係を作成することになります。それは問題だと思いますか?

私が達成しようとしている限りでは、Register が機能するには、親クラスの型が必要です。したがって、これは必須の依存関係です。必須でない場合は、設定するプロパティがあるだけです。リフレクションを使用できることはわかっていますが、パフォーマンス上の理由から、それを避けようとしています。

もう 1 つの方法は、顧客コンストラクターの先頭で、Registry クラスに (パブリック プロパティを介して) タイプを設定することです。しかし、ここでも、Register を使用する人が知っておく必要があるこの実装の癖は、私が強制できるものではありません。

乾杯アンソニー

于 2008-10-27T03:58:03.993 に答える