3

我有一个依赖项,需要将其注入我的一个类中。这种依赖将是生活方式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.ResolveCustomer然后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 需要具有父类的类型才能完成工作。因此,它是强制性的依赖。如果它不是强制性的,我只会有一个我要设置的属性。我知道我可以使用反射,但出于性能原因,我试图避免这种情况。

另一种选择是,在客户构造函数的顶部,我在 Registry 类上设置类型(通过公共属性)。但是,使用 Register 的人需要知道这个实现的怪癖,而不是我可以强制执行的怪癖。

干杯安东尼

于 2008-10-27T03:58:03.993 回答