【问题标题】:Inherited C# Class Losing "Reference"继承的 C# 类丢失“引用”
【发布时间】:2010-10-25 14:55:47
【问题描述】:

我有一个使用接口的部分类,因为我无法继承原来的抽象类,因为另一个部分类是从 Entity Framework 4 自动生成的,因此已经继承了 ObjectContext。

我的部分课程有以下内容:

namespace Model
{
    using Microsoft.Practices.EnterpriseLibrary.Validation;
    using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
    using Utilities.BusinessRules;
    using Utilities.BusinessRules.Rules;

    [HasSelfValidation]
    public partial class MyObject : IBusinessObject
    {
        private readonly IBusinessObject businessObject = new BusinessObject();

        private IBusinessObject BusinessObject
        {
            get
            {
                return businessObject;
            }
        }

        public Comment()
        {
            AddRule(new ValidateRequired("Title"));
        }

        public void AddRule(BusinessRule rule)
        {
            BusinessObject.AddRule(rule);
        }

        [SelfValidation]
        public void Validate(ValidationResults results)
        {
            BusinessObject.Validate(results);
        }
    }
}

界面如下:

namespace Utilities.BusinessRules
{
    using Microsoft.Practices.EnterpriseLibrary.Validation;

    public interface IBusinessObject
    {
        void AddRule(BusinessRule rule);

        void Validate(ValidationResults results);
    }
}

以及实现:

namespace Utilities.BusinessRules
{
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Practices.EnterpriseLibrary.Validation;
    using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

    public class BusinessObject : IBusinessObject
    {
        private readonly IList<BusinessRule> businessRules = new List<BusinessRule>();

        public void AddRule(BusinessRule rule)
        {
            this.businessRules.Add(rule);
        }

        [SelfValidation]
        public void Validate(ValidationResults results)
        {
            foreach (var rule in this.businessRules)
            {
                if (!rule.Validate(this))
                {
                     results.AddResult(new ValidationResult(rule.ErrorMessage, this, rule.Key, rule.Tag, null));
                }
            }
        }
    }
}

不用担心规则,它们有效。问题是如果我在测试项目中使用抽象类,BusinessObject 中的 Validate() 方法将正确地将(this)标识为继承抽象类的任何类(在此示例中,我希望它是 MyObject)。 不幸的是,切换到接口,(this) 会丢失继承类,而是将其标识为 BusinessObject。

如何才能正确识别继承类?

这是调用控制台类:

namespace ModelConsumer
{
    using Model;
    using System;
    using Microsoft.Practices.EnterpriseLibrary.Validation;

    class Program
    {
        static void Main(string[] args)
        {
            using (var myEntities = new MyEntities())
            {
                var myObject= new MyObject();

                myObject.Title = "Credo";

                var validationResults = Validation.Validate(myObject);

                if (validationResults.IsValid)
                {
                    myEntities.MyObjects.AddObject(myObject);
                    //myEntities.SaveChanges();

                    Console.WriteLine("Valid.");
                }
                else
                {
                    foreach (var validationResult in validationResults)
                    {
                        Console.WriteLine(validationResult.Message);
                    }
                }

                Console.Read();
            }
        }
    }
}

这应该是有效的,但实际上是无效的,因为 (this) 被标识为类型 BusinessObject 而不是 MyObject。

啊!离得这么近,好烦。

理查德

【问题讨论】:

  • 为什么public Comment()没有返回类型?
  • 这是一个构造函数,所以没有返回类型。

标签: c# inheritance entity-framework-4


【解决方案1】:

我相信您的 BusinessObject 实现是在假设它将被继承的情况下编写的。但是,既然您将其用作组合对象,则需要进行一些更改:

public interface IBusinessObjectValidator
{
  void AddRule(BusinessRule rule);

  void Validate(IBusinessObject target, ValidationResults results);
}


Public class BusinessObject: IBusinessObjectValidator
{
...

  public void Validate(IBusinssObject target, ValidationResults results)
  {
      foreach (var rule in this.businessRules)
      {
          if (!rule.Validate(target))
          {
             results.AddResult(new ValidationResult(rule.ErrorMessage, target, rule.Key, rule.Tag, null));
          }
      }
  }
}

你将按如下方式使用它:

[HasSelfValidation]
    public partial class MyObject : IBusinessObject
    {
        private readonly IBusinessObjectValidator validator = new BusinessObject();

        private IBusinessObjectValidator BusinessObjectValidator
        {
            get
            {
                return validator ;
            }
        }
    public Comment()
    {
        AddRule(new ValidateRequired("Title"));
    }

    public void AddRule(BusinessRule rule)
    {
        validator .AddRule(rule);
    }

    [SelfValidation]
    public void Validate(ValidationResults results)
    {
        validator.Validate(this, results);
    }
}

本质上,我们是说我们将在外部实现验证器,因此,我们需要将目标对象(正在验证的)传递给 validate 方法。我还建议将 BusinessObject 重命名为 BusinessObjectValidtor。

【讨论】:

  • 您好,感谢您的回复。我认为,这绝对是要采取的方向。但是如果将 BusinessObject 重命名为 BusinessObjectValidator(好点),您的代码中引用的 IBusinessObject / BusinessObject 是什么?
  • 知道了!这是第二个界面。稍加调整,我现在就可以正常工作了:)非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
相关资源
最近更新 更多