gpt4 book ai didi

.net - 实现一个使用规范来确定要创建哪种类型的对象的工厂

转载 作者:行者123 更新时间:2023-12-04 03:21:06 29 4
gpt4 key购买 nike

这主要是一个思想实验。所以这都是示例代码。我的目标是使用规范模式来消除工厂内的巨大条件代码块。因此,对于这个示例,我有一个 StatusData 对象,我想获得适合它的 IStatusUpdate 实现。

我有以下一组测试:

    [TestMethod]
public void Factory_Interface_Should_Return_IStatusUpdate()
{
var factory = MockRepository.GenerateMock<IUpdateFactory<StatusData>>();
var obj = MockRepository.GenerateStub<IStatusUpdate>();

var data = new StatusData();
factory.Stub(x => x.Get(data)).Return(obj);

var item = factory.Get(data);

Assert.IsInstanceOfType(item, typeof(IStatusUpdate));
}

[TestMethod]
public void StatusUpdateFactory_Should_Return_IStatusUpdate()
{
var factory = new StatusUpdateFactory();
var data = new StatusData();

var item = factory.Get(data);

Assert.IsInstanceOfType(item, typeof(IStatusUpdate));
}

[TestMethod]
public void StatusUpdateFactory_Should_Return_NewStatusUpdate_When_Status_Is_New()
{
var data = new StatusData(Status.New);
var factory = new StatusUpdateFactory();

var item = factory.Get(data);

Assert.IsInstanceOfType(item, typeof(NewStatusUpdate));
}

到目前为止,我的工厂实现如下所示:

public class StatusUpdateFactory:IUpdateFactory<StatusData>
{
public IStatusUpdate Get(StatusData item)
{
IList<ISpecification<StatusData>> specs = GetSpecifications();

foreach (var spec in specs)
{
if (spec.IsSatisfiedBy(item))
//how do I do this?
return new NewStatusUpdate();

}
return null;
}

private IList<ISpecification<StatusData>> GetSpecifications()
{
var returnList = new List<ISpecification<StatusData>>();
var specTypes = this.GetType().Assembly.GetTypes()
.Where(z => z.IsInstanceOfType(typeof(ISpecification<StatusData>)))
.ToList();


specTypes.ForEach(x => returnList.Add(Activator.CreateInstance(x) as ISpecification<StatusData>));

return returnList;

}
}

一旦我发现状态对象满足的规范,我就会陷入困境,我如何将该规范映射到实现 IStatusUpdate 的类型。我被难住了。

有人正确地建议我需要将规范映射到 IStatusUpdate 实现者。此映射似乎是工厂的责任,将其从规范中删除听起来像是违反了 SRP。我可以创建一个具有该职责的 Mapper 类,但这看起来不是很通用,并且还提出了一个问题,即如何将映射器映射到规范。

我还缺少一点点飞跃。

最佳答案

如果我没理解错的话,你想要给定一个实现 ISpecification 的对象,你想要一个实现 IStatusUpdate 的对象?

在您的示例中,这些类型均未定义,因此我不知道您可以使用它们之间是否存在任何关系。

但您可能需要一些工厂来保存代码,或者需要一个方法 ISpecification.GetUpdate() 来创建对象。

关于.net - 实现一个使用规范来确定要创建哪种类型的对象的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/567868/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com