【问题标题】:Create a base fluent ordered constructor创建一个基本流利的有序构造函数
【发布时间】:2013-09-10 14:18:47
【问题描述】:

编辑: 好吧,好像例子没用……

我有一个有序的流式构造函数,它对许多对象都是通用的(都具有相同的属性)。有没有办法将所有代码放在同一个基工厂类中,而派生工厂中只有最终的构造函数?

我使用这样的构造函数

.InitCreation()
.WithID()
.WithPoperty1()
.Create()

只有 Create() 创建新对象,ID 是必填字段。

泛型似乎我需要重写所有工厂中的所有方法,而我只想重写 Create() 方法以返回正确的对象。

另一种方法是在 fluent 构造函数中授予必填字段,而不使用有序的 fluent,但找不到什么可做的

EDIT2

基础工厂:

    namespace FunzIA.DL.Factory
{
    public class BaseObjectFactory : IBaseObjectCreated, IBaseObjectWithMandatoryField1, IBaseObjectWithFields
{
    internal int mandatoryField1 { get; set; }
    internal string mandatoryField12 { get; set; }
    internal bool optionaField1 { get; set; }

    private BaseObjectFactory(){}

    public static IBaseObjectCreated InitCreation()
    {return new BaseObjectFactory(); }

    public IBaseObjectWithMandatoryField1 WithMandatoryField1(int number)
    {
        mandatoryField1 = number;
        return this;
    }

    public IBaseObjectWithFields ConmandatoryField12(string text)
    {
        mandatoryField12 = text;
        return this;
    }

    public IBaseObjectWithFields optionaField1(bool optionaField1P)
    {
        optionaField1 = optionaField1P;
        return this;
    }

    public BaseObject Create()
    {return new BaseObject(this);}
}



public interface IBaseObjectCreated
{IBaseObjectWithMandatoryField1 WithMandatoryField1(int number);}

public interface IBaseObjectWithMandatoryField1 
{IBaseObjectWithFields ConmandatoryField12(string text);}

public interface IBaseObjectWithFields
{
    IBaseObjectWithFields optionaField1(bool optionaField1);
    BaseObject Create();
}
}

老例子

我以这种方式创建了一个类Struttura:

namespace FunzIA.DL.Oggetti
{
public class Struttura
{
    public int IdStruttura { get; set; }
    public string Descrizione { get; set; }
    public bool Annullato { get; set; }

    private Struttura(){}
    public Struttura(StrutturaFactory factory)
    {
        IdStruttura = factory.idStruttura;
        Descrizione = factory.descrizione;
        Annullato = factory.annullato;
    }   
}
}

他的Fuent Constructori是这样的:

namespace FunzIA.DL.Factory
{
    public class StrutturaFactory : IStrutturaCeato, IStrutturaConChiave, IStrutturaConProprieta
{
    internal int idStruttura { get; set; }
    internal string descrizione { get; set; }
    internal bool annullato { get; set; }
    internal IList<Processo> processi { get; set; }

    private StrutturaFactory(){}

    public static IStrutturaCeato IniziaCreazione()
    {return new StrutturaFactory(); }

    public IStrutturaConChiave ConCodice(int codiceP)
    {
        idStruttura = codiceP;
        return this;
    }

    public IStrutturaConProprieta ConDescrizione(string nome)
    {
        descrizione = nome;
        return this;
    }

    public IStrutturaConProprieta Annullato(bool annullatoP)
    {
        annullato = annullatoP;
        return this;
    }

    public Struttura Crea()
    {return new Struttura(this);}
}



public interface IStrutturaCeato 
{IStrutturaConChiave ConCodice(int chiave);}

public interface IStrutturaConChiave 
{IStrutturaConProprieta ConDescrizione(string nome);}

public interface IStrutturaConProprieta
{
    IStrutturaConProprieta Annullato(bool annullato);
    IStrutturaConProprieta ConProcessi(IList<Processo> processi);
    Struttura Crea();
}
}

这样我就可以这样写构造函数了

Struttura actual = StrutturaFactory.IniziaCreazione()
                                .ConCodice(1)
                                .ConDescrizione("MiaDescrizione")
                                .Crea();

但是现在我看到我有许多具有相似字段(ID、描述、取消)的对象,所以我尝试编写一个通用的流式构造函数:

namespace FunzIA.DL
{
public class OggettoBaseFactory : IOggettoBaseCeato, IOggettoBaseConChiave, IOggettoBaseConProprieta
{
    internal int id { get; set; }
    internal string descrizione { get; set; }
    internal bool annullato { get; set; }

    private OggettoBaseFactory(){}

    public static IOggettoBaseCeato IniziaCreazione()
    {return new OggettoBaseFactory();}

    public IOggettoBaseConChiave ConCodice(int codiceP)
    {
        id = codiceP;
        return this;
    }

    public IOggettoBaseConProprieta ConDescrizione(string nome)
    {
        descrizione = nome;
        return this;
    }

    public IOggettoBaseConProprieta Annullato(bool annullatoP)
    {
        annullato = annullatoP;
        return this;
    }

    public OggettoBase Crea()
    {return null;}
}



public interface IOggettoBaseCeato 
{IOggettoBaseConChiave ConCodice(int chiave);}

public interface IOggettoBaseConChiave 
{IOggettoBaseConProprieta ConDescrizione(string nome);}

public interface IOggettoBaseConProprieta
{
    IOggettoBaseConProprieta Annullato(bool annullato);
    OggettoBase Crea();
}
}

并修改我的工厂

namespace FunzIA.DL.Factory
{
    public class StrutturaFactory : OggettoBaseFactory
    {
        public Struttura Crea()
        {return new Struttura(this);}
    }
}

但是现在当我写 Struttura 实际 = StrutturaFactory.IniziaCreazione() .ConCodice(idExpected) .ConDescrizione(描述预期) .Annullato(annullatoExpected) .Crea();

我得到这个错误:

错误 5 无法将类型“FunzIA_DL.OggettoBase”隐式转换为“FunzIA.DL.Oggetti.Struttura”。存在显式转换(您是否缺少演员表?)

有没有办法做到这一点,或者我必须在所有流利的构造函数中重写相同的逻辑?

【问题讨论】:

  • 如果您想获得答案,提供带有英文标识符的较短示例代码可能是个好主意。
  • 我把它缩短了一点,但它是理解问题的最少代码。标识符名称对问题没有多大意义...
  • 你必须使用泛型。
  • 我也在搜索它并找到了这篇文章:stackoverflow.com/questions/1677938/… 但看不到将它与有序流利的集成。
  • 我编辑了第一篇文章,尽量简单。感谢您的耐心等待

标签: c# generics constructor fluent-interface


【解决方案1】:

像这样投射它:

Struttura actual = (Struttura)StrutturaFactory.IniziaCreazione() .ConCodice(idExpected) .ConDescrizione(descrizioneExpected) .Annullato(annullatoExpected) .Crea();

【讨论】:

  • 好的,但是这样你使用的是基类的“Crea()”方法,它什么也不做,我想使用派生类的“Crea()”方法
  • 这样就解决了异常问题。您想使用派生类的方法在您的原始问题中没有很好地表达。我无法理解您在意大利语中的代码。您必须减少混乱并尝试其他 cmets 中建议的英文标识符。
  • 我编辑了第一篇文章,尽量简单。感谢您的耐心等待
  • 如果不是我的问题的解决方案,为什么要标记为解决方案?解决方案如下...
  • 您是将此标记为解决方案的人。尝试撤消它。
【解决方案2】:

我在 BaseFactory 中以这种方式使用泛型解决了:

public T Create<T>()
        {
            return (T)Activator.CreateInstance(typeof(T), this);
        }

那么我的 DerivedFactory 就是这样的:

namespace FunzIA.DL.Factory
{
    public class SocietyFactory : BaseFactory
    {}
}

所以我可以写

Society actual = SocietyFactory.InitCreation()
                    .WithCode(idExpected)
                    .Create<Societa>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2012-05-04
    相关资源
    最近更新 更多