Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 域建模-实现属性或POCO的接口?_C#_Design Patterns_Repository - Fatal编程技术网

C# 域建模-实现属性或POCO的接口?

C# 域建模-实现属性或POCO的接口?,c#,design-patterns,repository,C#,Design Patterns,Repository,我正在原型化一个工具,该工具将通过SOAP api将文件导入到基于web的应用程序中,并对我试图通过C#接口导入的内容进行建模,这样我就可以将web应用程序的模型数据封装到我可以处理的东西中 public interface IBankAccount { string AccountNumber { get; set; } ICurrency Currency { get; set; } IEntity Entity { get; set; } BankAccou

我正在原型化一个工具,该工具将通过SOAP api将文件导入到基于web的应用程序中,并对我试图通过C#接口导入的内容进行建模,这样我就可以将web应用程序的模型数据封装到我可以处理的东西中

public interface IBankAccount
{
    string AccountNumber { get; set; }
    ICurrency Currency { get; set; }
    IEntity Entity { get; set; }
    BankAccountType Type { get; set; }
}

internal class BankAccount
{
    private readonly SomeExternalImplementation bankAccount;

    BankAccount(SomeExternalImplementation bankAccount)
    {
        this.bankAccount = bankAccount;
    }

    // Property implementations
}
然后,我有一个存储库,可以返回IBankAccount集合或其他集合,如果需要,还可以使用一个工厂类为我创建BankAccounts


我的问题是,这种方法会给我带来很多痛苦,创建POCO会更好吗?我想将所有这些放在一个单独的组件中,并将数据访问和业务逻辑完全分离,因为我在这里处理的是一个移动的目标,即数据将在线存储在哪里。

这正是我使用的方法,我从来没有遇到过任何问题。在我的设计中,来自数据访问层的任何内容都被抽象为一个接口(我将它们称为数据传输契约)。在我的域模型中,我使用静态方法从这些数据传输对象创建业务实体

interface IFooData
{
    int FooId { get; set; }
}

public class FooEntity
{
    static public FooEntity FromDataTransport(IFooData data)
    {
        return new FooEntity(data.FooId, ...);
    }
}
当您的域模型实体从多个数据契约收集数据时,它非常方便:

public class CompositeEntity
{
    static public CompositeEntity FromDataTransport(IFooData fooData, IBarData barData)
    {
        ...
    }
}
与您的设计不同,我不提供工厂来创建数据传输契约的具体实现,而是提供委托来编写值,并让存储库担心创建具体对象

public class FooDataRepository
{
    public IFooData Insert(Action<IFooData> insertSequence)
    {
        var record = new ConcreteFoo();

        insertSequence.Invoke(record as IFooData);

        this.DataContext.Foos.InsertOnSubmit(record); // Assuming LinqSql in this case..

        return record as IFooData;
    }
}

虽然在我看来,工厂实现是一个同样优雅的解决方案。为了回答您的问题,根据我的经验,我从未遇到过任何重大问题,我认为您在这方面的做法是正确的:)

谢谢您的回答。我更喜欢将委托与存储库的insert方法一起使用,而不是使用工厂来创建具体的实现。
IFooData newFoo = FooRepository.Insert(f =>
    {
        f.Name = "New Foo";
    });