LINQ, Polymorphism, MetaDataMapping, Inheritance Mapper

本文关键字:Mapper Inheritance Polymorphism LINQ MetaDataMapping | 更新日期: 2023-09-27 17:47:21

我正在编写一个小程序。 我正在编写的用于控制创建的每个存储库的接口定义了Save(IPublicObject)的方法。 我正在使用 LINQ 作为存储库 CRUD 的 SQL 版本。 我的问题是这个。 我只想使用一种接受接口类型的方法。 我想思考如何最好地找到我随后传入的继承类型的 Save 操作。

在这本书中,我正在阅读企业应用程序架构的模式。 我靠的是继承马平。 所以我创建了一个派生对象

public class ConcretePublicObjectOne : IPublicObject{}

然后我想将其传递到存储库的保存函数中。 正是在这一点上,我试图思考如何最好地说,好吧,我们需要使用"什么?保存方法等...

我应该使用注册表、配置设置映射类型吗?

LINQ, Polymorphism, MetaDataMapping, Inheritance Mapper

对于 LINQ to-SQL,数据上下文已经为您执行了大量映射。因此,我认为泛型可能是实现保存的最佳方式,同时仍然考虑您的界面(尽管我不太确定在这种情况下界面为您提供了什么......

您可以通过GetTable<T>()访问数据上下文的通用方面:

    static void Save<T>(T item)
        where T : class, IPublicObject
    {
        using (DataContext ctx = GetDataContext())
        {
            Table<T> table = ctx.GetTable<T>();
            // for insert...
            table.InsertOnSubmit(item);
            // for update...
            table.Attach(item, true);
            // for delete...
            table.DeleteOnSubmit(item);
            ctx.SubmitChanges();
        }
    }

请注意,类型推断应该意味着在保存时不需要指定T

    Foo foo = new Foo();
    Save(foo); // <Foo> is inferred

这有什么用吗?

您希望做的是:

Repository.Save(publicObject)

以及从 publicObject 调用方法的存储库?

如果这是要求,则可以将存储库中的 Save 方法定义为:

public class Repository {
    public void Save(IPublicObject publicObject) {
        publicObject.Save();
    }
}

其中 IPublicObject 定义为:

public interface IPublicObject {
    void Save();
}

但是使用这种方法,您必须为每个实体定义一个保存方法(如示例中的 ConcretePublicObjectOne)

Marc Gravell:

谢谢。 正如我所说,尽管我认为使用您的示例,我必须保留从数据上下文中获得的模型,这些模型将我绑定到 LINQ。

你所做的正是我正在寻找的那种东西。 它根据对象查找类型,然后知道要提交的操作。 使用您的示例,我是否可以使用匿名类型将转换应用于我的模型以使用该 linq 代码。 我有不同的商店mdeium,你看到我需要模型全面使用。 这些模型有点自给自足,对他们的任何事情一无所知,哈哈。