0

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

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

public class ConcretePublicObjectOne : IPublicObject{}

然后我想将它传递给存储库的保存功能。正是在这一点上,我试图思考如何最好地说,好的,我们需要使用“什么?” 保存方法等...

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

4

3 回答 3

3

对于 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

这有什么用吗?

于 2008-10-19T14:39:04.740 回答
0

你想要做的是有一个:

Repository.Save(publicObject)

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

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

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

其中 IPublicObject 定义为:

public interface IPublicObject {
    void Save();
}

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

于 2008-10-19T12:55:37.600 回答
0

马克·格拉维尔:

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

你所做的正是我正在寻找的那种东西。它根据对象找到类型,然后知道要提交哪个操作。使用您的示例,我可以使用匿名类型将转换应用于我的模型以使用该 linq 代码。我有不同的存储 mdeiums,你会看到我需要模型来全面处理。这些模型是自包含的,对它们之外的任何东西一无所知,哈哈。

于 2008-10-20T07:44:11.850 回答