DI-Динамический параметр типа Тип, где тип является типом родительских объектов - PullRequest
3 голосов
/ 27 октября 2008

У меня есть зависимость, которую мне нужно внедрить в один из моих классов. Эта зависимость будет образом жизни 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.

Ответы [ 4 ]

1 голос
/ 01 декабря 2008

Самое простое решение, которое я вижу, это изменить его на

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

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

И зарегистрируйте IRegister в качестве открытого универсального класса.

0 голосов
/ 27 октября 2008

Я думал об этом, но это означало бы, что родительский объект должен был бы знать об этой маленькой особенности реализации. Следовательно, я буду создавать зависимость, которую я больше не смог бы навязать. Вы считаете это проблемой?

Что касается того, чего я пытаюсь достичь, у Реестра должен быть тип родительского класса, чтобы он мог выполнять свою работу. Следовательно, это обязательная зависимость. Если бы это не было обязательным, я бы просто установил свойство. Я знаю, что могу использовать рефлексию, но по соображениям производительности я пытаюсь избежать этого.

Другая альтернатива заключается в том, что когда я наверху конструктора customer, я устанавливаю тип в классе Registry (через открытое свойство). Но, опять же, это странная реализация, о которой человеку, использующему Реестр, нужно будет знать, а не о том, что я мог бы применить.

Приветствие Энтони

0 голосов
/ 27 октября 2008

Что именно делает регистр? Использует ли когда-либо объект customer внутренний регистр?

Я не знаю, какой DI-контейнер вы используете, но при условии, что вы используете Windsor, у вас может быть пользовательское средство для перехвата создания любого компонента, а затем для взаимодействия с вашим регистром. Таким образом, вам даже не нужно, чтобы класс клиента принимал регистр в качестве параметра.

0 голосов
/ 27 октября 2008

Я не совсем уверен, что вы пытаетесь достичь этого, но вместо этого вы можете захотеть переписать свой код, так что вы делаете:

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

Таким образом, вы передаете экземпляр в регистр, таким образом вам не нужно передавать тип в конструктор, и вы все равно можете использовать свой DI-контейнер. Я надеюсь, что это имеет смысл ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...