Как я разрешаю объекты при загрузке в XDocument?

"Парень выше говорит, что создает другой интерфейс для обработки нового участника (участников). Ничто не повреждается.

Не тот состав? Почему бы не использовать состав без интерфейсов? Более гибкий".

Вы, кажется, думаете о составе с точки зрения наследования, как в, "я наследую все эти возможности в этот объект сделать это задание". Это - плохой способ написать код. Это похоже на высказывание, "Я хочу создать небоскреб, таким образом, я узнаю, что каждое задание там должно знать, от того, как создать проекты на вниз к тому, как бедным основа и устанавливает освещение... "

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

Поэтому, где к интерфейсам вписываются? Они - контракт между отдельными объектами. Они позволяют Вам способность не заботиться о человеке, конкретных реализациях. Они позволяют Вам говорить общий язык с набором объектов, которые распределяют ту же ответственность, но могут на самом деле иметь другую реализацию. Интерфейс становится абстракцией к объекту, выполняющему задачу. Я не должен знать, как каждый парень с молотком работает, просто что он знает как к HitNail ().

, Когда Вы начинаете составлять сложную систему кода с большим количеством маленьких классов, которые имеют единственные обязанности, затем Вы скоро узнаете, что можно столкнуться с серьезными проблемами, если Вы полагаетесь слишком много на конкретную реализацию данного класса, и что класс начинает изменяться... Таким образом вместо того, чтобы полагаться на конкретную реализацию, мы создаем интерфейс - абстракция. И мы говорим, "Я не забочусь, как Вы делаете JobX, только что Вы делаете это".

существуют другие преимущества для интерфейсов как тестирование, насмешка, и т.д. Но это не причина кодировать к интерфейсу. Причина состоит в том, чтобы создать систему кода, который не зависит от специфических особенностей и таким образом высоко связанный друг с другом. Поэтому, с Вашим графиком, думая мозг, необходимо бояться связи набора реальных классов друг другу. Поскольку изменения в одном из тех классов вызовут волновой эффект.

при связи себя с абстракцией вместо реального класса Вы ограничиваете связь. Вы говорите, я" m только собирающийся связываться с контрактом, о котором мы договариваемся, и ничто иное". И если класс, реализовывая тот контракт изменяет свой внутренний способ выполнить его задачу, Вы не заботитесь, потому что Вы не полагаетесь на свойство неконтракта или метод. Вы полагаетесь только на согласованное контракт.

9
задан Dave 29 October 2009 в 18:45
поделиться

1 ответ

Это результат сотрудничества msdn и сообщений в блогах.

        XDocument document;

        using (var stringReader = new StringReader(output))
        {
            var settings = new XmlReaderSettings
            {
                ProhibitDtd = false,
                XmlResolver = new LocalXhtmlXmlResolver(bool.Parse(ConfigurationManager.AppSettings["CacheDTDs"]))
            };

            document = XDocument.Load(XmlReader.Create(stringReader, settings));
        }

    private class LocalXhtmlXmlResolver : XmlUrlResolver
    {
        private static readonly Dictionary<string, Uri> KnownUris = new Dictionary<string, Uri>
        {
            { "-//W3C//DTD XHTML 1.0 Strict//EN", new Uri("http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd") },
            { "-//W3C XHTML 1.0 Transitional//EN", new Uri("http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd") },
            { "-//W3C//DTD XHTML 1.0 Transitional//EN", new Uri("http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd") },
            { "-//W3C XHTML 1.0 Frameset//EN", new Uri("http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd") },
            { "-//W3C//DTD XHTML 1.1//EN", new Uri("http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd") }
        };

        private bool enableHttpCaching;
        private ICredentials credentials;

        public LocalXhtmlXmlResolver(bool enableHttpCaching)
        {
            this.enableHttpCaching = enableHttpCaching;
        }

        public override Uri ResolveUri(Uri baseUri, string relativeUri)
        {
            Debug.WriteLineIf(!KnownUris.ContainsKey(relativeUri), "Could not find: " + relativeUri);

            return KnownUris.ContainsKey(relativeUri) ? KnownUris[relativeUri] : base.ResolveUri(baseUri, relativeUri);
        }

        public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
        {
            if (absoluteUri == null)
            {
                throw new ArgumentNullException("absoluteUri");
            }

            //resolve resources from cache (if possible)
            if (absoluteUri.Scheme == "http" && this.enableHttpCaching && (ofObjectToReturn == null || ofObjectToReturn == typeof(Stream)))
            {
                var request = WebRequest.Create(absoluteUri);

                request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);

                if (this.credentials != null)
                {
                    request.Credentials = this.credentials;
                }

                var response = request.GetResponse();

                return response.GetResponseStream();
            }

            //otherwise use the default behavior of the XmlUrlResolver class (resolve resources from source)
            return base.GetEntity(absoluteUri, role, ofObjectToReturn);
        }
    }
10
ответ дан 4 December 2019 в 11:42
поделиться
Другие вопросы по тегам:

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