Там какой-либо путь состоит в том, чтобы наследовать класс без конструкторов в.NET?

приведенный ниже код сначала регистрирует Foo1 для IFoo, а затем заменяет службу для IFoo на Foo2.

services
  .AddTransient<IFoo, Foo1>()
  .AddTransient<IFoo, Foo2>();

для вашего третьего запроса,

Вы не можете сделать это, потому что вы пытаетесь сгенерировать регистрацию для IFoo, используя IFoo, что приводит к ожидаемому StackOverflowException (как вы уже упоминали) ).

1113 То, что вы делаете, это. Сначала зарегистрируйте каждую службу отдельно,

 services
  .AddTransient<Foo1>()
  .AddTransient<Foo2>();

, затем используйте условную регистрацию, используя фабричный метод.

serviceCollection.AddTransient(factory =>
{
    //get the key here. you can use factory.GetService
    // to get another service and extract Key from it.
     switch(key)
     {
         case "Foo1":
              return factory.GetService<Foo1>();
              break;
         case "Foo2":
              return factory.GetService<Foo2>();
              break;
         default:
              return null;
      }
}
7
задан Jader Dias 30 December 2008 в 15:46
поделиться

2 ответа

Если Вы не можете обмануть конструктора сериализации для выполнения указаний, затем не, нет никакого пути.

Конструкторы того класса являются внутренними, таким образом, у Вас нет способа назвать их.

4
ответ дан 6 December 2019 в 12:56
поделиться

Вы не можете посредством наследования от HttpWebRequest (если Вы не хотите вызывать конструктора сериализации), но Вы можете через состав и делегацию, и посредством наследования от WebRequest (я не уверен, сделает ли это это для Вас, но функционально это весьма схоже). WebRequest имеет конструктора по умолчанию.

В этом случае у Вас затем не может быть класса 'быть' HttpWebRequest (как в - отношения), так как Вы не можете расшириться от него, но его wil 'быть' WebRequest, который должен быть достаточным.

Вы могли записать класс, который наследовался WebRequest, который имеет члена экземпляра типа WebRequest, создайте HttpWebRequest и присвойте члену экземпляра в конструкторе нового типа и делегируйте все вызовы к той ссылке (вид шаблона "декоратор"):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;

namespace ClassLibrary1
{
    public class MyHttpWebRequest : WebRequest
    {
        private WebRequest request;

        public MyHttpWebRequest(string uri)
        {
            request = HttpWebRequest.Create(uri);
        }

        public override WebResponse GetResponse()
        {
            // do your extras, or just delegate to get the original code, as long
            // as you still keep to expected behavior etc.
            return request.GetResponse();
        }

    }
}
12
ответ дан 6 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: