尝试实现策略模式时的WrongClassException(区分自己的Id)
我正在尝试使用Fluent Nhibernate实现策略模式,受此博客文章的启发
public abstract class Strategy { protected Strategy() { } protected Strategy(Guid id) { this.Id = id; } public virtual Guid Id { get; set; } public abstract void SomeMethod(); } public class MyStrategy : Strategy { public MyStrategy() : base(new Guid("F1CF041B ...")) { } public override void SomeMethod() { } } public class StrategyMap : ClassMap { public StrategyMap() { this.Id(x => x.Id).GeneratedBy.Assigned(); this.DiscriminateSubClassesOnColumn("Id"); } } public class MyStrategyMap : SubclassMap { public MyStrategyMap() { this.DiscriminatorValue("F1CF041B ..."); } }
但是当我运行以下测试时( this.Session
来自内存数据库):
[TestMethod] public void CanGetMyStrategy() { // Arrange using (var transaction = this.Session.BeginTransaction()) { this.Session.Save(new MyStrategy()); transaction.Commit(); this.Session.Clear(); } // Act var strategies = this.Session.Query(); // Assert Assert.IsNotNull(strategies.FirstOrDefault()); }
抛出以下exception:
NHibernate.WrongClassException: Object with id: f1cf041b ... was not of the specified subclass: Namespace.Strategy (Discriminator was: 'f1cf041b ...')
任何帮助调试此问题将不胜感激,因为我无法弄清楚为什么这不起作用。
不满意的解决方案
我可以通过不区分Id列来获得代码(因此创建另一个列来区分),但我发现这不令人满意,因为它意味着重复数据。
为何选择Guid?
这背后的原因是新Strategy
将能够通过插件架构创建(提供Strategy
和SubclassMap
,在应用程序加载时读取),因此我需要使用Guid
因此与Ids没有冲突。
似乎在Strategy类中您使用的是类型为Guid
Id
,但在mapper类中使用了string
而不是Guid
。
我改变了地图类,如下所述,exception不再出现
上述就是C#学习教程:尝试实现策略模式时的WrongClassException(区分自己的Id)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
public class MyStrategyMap : SubclassMap { public MyStrategyMap() { this.DiscriminatorValue(new Guid("F1CF041B ...")); } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/943225.html