我有一个依赖项,我需要注入我的一个类。这种依赖关系将是Transient
的生活方式。它反过来具有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
,所以这不可行。因此,我需要一种方法,通过配置或通过container.Register
。
答案 0 :(得分:1)
我能看到的最简单的解决方案是将其更改为
public interface IRegister<TParent> { ... }
public class Register<TParent> : IRegister<TParent>
{
public Register() { ... }
}
public class Customer : ICustomer
{
public Customer(IRegister<Customer> register) { .... }
}
将IRegister注册为开放的通用类。
答案 1 :(得分:0)
我不完全确定你是想要实现的,但是你可能想要重写你的代码,所以你正在做:
public interface IRegister{
RegisterResult MyMethod(object thing);
}
所以你将实例传递给寄存器,这样你就不需要将类型传递给构造函数,你仍然可以使用你的DI容器。我希望这是有道理的......
答案 2 :(得分:0)
寄存器的确是什么?客户对象是否曾在内部使用该寄存器?
我不知道您正在使用哪个DI容器,但假设您使用的是Windsor,您可以使用自定义工具拦截任何组件创建,然后在那里与您的注册进行交互。这样,您甚至不必让客户类将寄存器作为参数。
答案 3 :(得分:-1)
我想到了这一点,但这意味着父对象需要知道这个小实现的怪癖。因此,我将创建一个我无法执行的依赖项。你认为这是一个问题吗?
就我想要实现的目标而言,Register需要具有父类的类型才能完成它的工作。因此,它是一种强制性的依赖。如果它不是强制性的,我只会拥有一个我要设置的属性。我知道我可以使用反射,但出于性能原因,我试图避免这种情况。
另一种选择是,当在客户构造函数的顶部时,我在Registry类上设置类型(通过公共属性)。但是,这个实现再次推测使用Register的人需要知道,而不是我可以执行的那个。
干杯 安东尼