ile iBATIS.NET kullanarak iBATIS.NET ile eşlenen bir sınıf O/R'de genel bir özel koleksiyon arabirimi (Microsoft Kalıpları ve Uygulamaları Birimi ile enjeksiyon desteği) kullanmaya çalışıyorum. Bunun mümkün olup olmadığını ve nasıl yapılacağını bilen var mı? Genel özel koleksiyon arabirimleri ve Unity
I CollectionBase uzanan SqlDataItemCollection <T> eşlemek bir IDataItemCollection <T> arayüzü vardır. Sınıflarımda IDataItemCollection <T> kullanmak istiyorum, böylece SqlDataItemCollection <T> arabirimini Unity aracılığıyla arabirimi genişleten diğer sınıflarla birlikte değiştirebilirim. IBATIS.NET haritalama dosyası, beton sınıfını doğrudan diğeri olmadan da olmayacağından referans alabilir.Aşağıda, kod, veritabanı ve eşlemelerin çok basitleştirilmiş bir örneğini ekledim. Ben tamamen iBATIS.NET için yeni ve sadece şu anda kullanımını kanıtlamak istiyorum, bu yüzden eşleme XML gerektiği gibi yeniden jig lütfen.
Çok teşekkürler,
Paul
C# Kod
SQL Server 2005 veritabanı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
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 { }
<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>
Sorun, somut bir sınıf yerine bir arabirim kullandığım için görünüyor. IDataItemCollection'un SqlDataItemCollection ile değiştirilmesi, her şeyin beklendiği gibi çalışmasına neden olur, maalesef somut sınıfları Unity ile değiştirme yeteneğine ihtiyacım var. Bu bir iBATIS.NET kısıtlaması mı? –
tRi11