3

У меня есть зависимость, которую мне нужно вводить в один из моих классов. Эта зависимость будет образом жизни Transient. Он в свою очередь имеет зависимость от типа Type. Этот тип должен быть типом исходного класса. Мне просто интересно, есть ли у кого-нибудь идеи, как я могу провести эту регистрацию.DI- Динамический параметр типа Тип, где 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

Как насчет общего реестра ? – Hallgrim 2008-10-27 06:48:09

ответ

0

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

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

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

-1

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

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

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

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

0

Что это точно, что регистр делает? Объект клиента всегда использует реестр внутри страны?

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

1

Самое простое решение, которое я могу видеть, чтобы изменить его к

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^