我正在编写一个小程序。 我正在编写的用于控制创建的每个存储库的接口定义了Save(IPublicObject)的方法。 我正在使用 LINQ 作为存储库 CRUD 的 SQL 版本。 我的问题是这个。 我只想使用一种接受接口类型的方法。 我想思考如何最好地找到我随后传入的继承类型的 Save 操作。
在这本书中,我正在阅读企业应用程序架构的模式。 我靠的是继承马平。 所以我创建了一个派生对象
public class ConcretePublicObjectOne : IPublicObject{}
然后我想将其传递到存储库的保存函数中。 正是在这一点上,我试图思考如何最好地说,好吧,我们需要使用"什么?保存方法等...
我应该使用注册表、配置设置映射类型吗?
对于 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,你看到我需要模型全面使用。 这些模型有点自给自足,对他们的任何事情一无所知,哈哈。