我试图在一个与iBATIS.NET映射的类O/R中使用一个通用的自定义集合接口(以支持使用Microsoft和PracesUnified.O/R)。有人知道这是否可能,如果可能,如何实现?
我有一个IDataItemCollection接口,映射到SqlDataItemCollection,它扩展了CollectionBase。我想在我的类中使用IDataItemCollection,这样我就可以用其他类交换SqlDataItemCollection,这些类可以通过Unity扩展接口。iBATIS.NET映射文件可以直接引用具体的类,因为不会有一个没有另一个。
下面我已经包含了一个非常简单的代码、数据库和映射示例。我对iBATIS.NET完全陌生,现在我真的只想证明它的用途,所以请在必要时重新定义映射XML。
非常感谢,
保罗
C#码
public interface IDataItem
{
object Id { get; set; }
}
public class DataItem : IDataItem
{
public object Id { get; set; }
}
public interface IDataItemCollection<T> : ICollection where T : IDataItem
{
// Various Getters and Setters
...
}
public class SqlDataItemCollection<T> : CollectionBase, IDataItemCollection<T> where T : DataItem
{
public SqlDataItemCollection() { }
public SqlDataItemCollection(T injType) { }
// Getters and Setters to implement interfaces
...
}
public class Foo : DataItem
{
public Foo(IDataItemCollection<Bar> bars)
{
Bars = bars;
}
public IDataItemCollection<Bar> Bars { get; set; }
}
public class Bar : DataItem { }Server 2005数据库
CREATE TABLE Foo
(
Id bigint IDENTITY(1,1)
)
CREATE TABLE Bar
(
Id bigint IDENTITY(1,1)
)
CREATE TABLE FooBar
(
FooId bigint,
BarId bigint
)iBATIS.NET mapping.xml
<resultMaps>
<resultMap id="FooResult" class="Foo">
<result property="Id" column="Id"/>
<result property="Bars" column="Id" select="SelectBarsInFoo" lazyLoad="false"/>
</resultMap>
<resultMap id="BarResult" class="Bar">
<result property="Id" column="Id"/>
</resultMap>
</resultMaps>
<statements>
<select id="SelectFoo" resultMap="FooResult">
SELECT Id
FROM Foo
</select>
<select id="SelectBarsInFoo" parameterClass="long" resultMap="BarResult" listClass="SqlDataItemCollection`1[Bar]" >
SELECT Bar.Id
FROM Bar
JOIN FooBar ON Bar.Id = FooBar.BarId
WHERE FooBar.FooId = #value#
</select>
</statements>发布于 2010-07-01 19:56:11
在将应用程序的一部分重构回接口之后,我也遇到了同样的问题。通过显式地实现接口对集合的定义,然后将实现复制为它的具体类,我绕过了它。这可能解决不了你的问题。
public interface IGroup { }
public class Group : IGroup { }
public class IGroupCollection : IList<IGroup> { }
public class GroupCollection : IGroupCollection { }
public interface IConcrete
{
IGroupCollection Items { get; set; }
}
public class Concrete : IConcrete
{
public GroupCollection Items { get; set; }
IGroupCollection IConcrete.Items
{
get { return Items; }
set { Items = value as GroupCollection; }
}
}这允许iBATIS.NET在不遇到类型转换错误的情况下向集合添加项,而显式接口实现允许我在整个应用程序中使用IConcrete,而无需引用实际的Concrete或实际的GroupCollection。
https://stackoverflow.com/questions/603808
复制相似问题