我是相當新的國際奧委會也許我的泛型和繼承的理解是不是我想要做的足夠強大。你可能會覺得這是一團糟。我有一個通用的存儲庫<TEntity>基類:問題註冊一個通用存儲庫溫莎國際奧委會
public class Repository<TEntity> where TEntity : class, IEntity
{
private Table<TEntity> EntityTable;
private string _connectionString;
private string _userName;
public string UserName
{
get { return _userName; }
set { _userName = value; }
}
public Repository() {}
public Repository(string connectionString)
{
_connectionString = connectionString;
EntityTable = (new DataContext(connectionString)).GetTable<TEntity>();
}
public Repository(string connectionString, string userName)
{
_connectionString = connectionString;
_userName = userName;
EntityTable = (new DataContext(connectionString)).GetTable<TEntity>();
}
// Data access methods ...
... }
和繼承Repository中SqlClientRepository:
public class SqlClientRepository : Repository<Client>
{
private Table<Client> ClientTable;
private string _connectionString;
private string _userName;
public SqlClientRepository() {}
public SqlClientRepository(string connectionString) : base(connectionString)
{
_connectionString = connectionString;
ClientTable = (new DataContext(connectionString)).GetTable<Client>();
}
public SqlClientRepository(string connectionString, string userName)
: base(connectionString, userName)
{
_connectionString = connectionString;
_userName = userName;
ClientTable = (new DataContext(connectionString)).GetTable<Client>();
}
// data access methods unique to Client repository
... }
repository類提供了一些仿製藥的方法,如保存<TEntity>,刪除<TEntity>,我希望我所有的存儲庫派生類可以共享。
的TEntity參數被約束到IEntity接口:
public interface IEntity
{
int Id { get; set; }
NameValueCollection GetSaveRuleViolations();
NameValueCollection GetDeleteRuleViolations();
}
這允許存儲庫類引用其內保存這些方法和刪除的方法。單元測試做工精細的模擬SqlClientRepository實例,以及真實的數據庫直播單元測試。然而,在MVC方面:
public class ClientController : Controller
{
private SqlClientRepository _clientRepository;
public ClientController(SqlClientRepository clientRepository)
{
this._clientRepository = clientRepository;
}
public ClientController() { }
// ViewResult methods ...
... }
... _clientRepository總是空。我使用Windor Castle作爲IoC容器。這裏是配置:
<component id="ClientRepository" service="DomainModel.Concrete.Repository`1[[DomainModel.Entities.Client, DomainModel]], DomainModel"
type="DomainModel.Concrete.SqlClientRepository, DomainModel" lifestyle="PerWebRequest">
<parameters>
<connectionString>#{myConnStr}</connectionString>
</parameters>
</component>
我已經在Windsor配置文件中嘗試了很多變化。我懷疑這是上面代碼中更多的設計缺陷。正如我期待在我的代碼,它發生,我認爲與IoC容器註冊組件時,也許服務必須始終是一個接口。這可能嗎?有人有建議嗎?提前致謝。
---- ----修訂
針對答1,我已經追加了新的代碼示例,因爲它不會在下面的評論部分正確地格式化。
我能得到這個工作:
public class ClientController : Controller
{
private IClientRepository _clientRepository;
public ClientController(IClientRepository clientRepository) { ... }
}
public interface IClientRepository : IRepository<Client> { ... }
public class SqlClientRepository : IClientRepository { ... }
...但現在我需要重複我的保存和刪除SqlClientRepository內的方法和我的通用庫類的丟失帶來的好處。有一次,我嘗試和具有資源庫<客戶> SqlClientRepository繼承再次,像這樣:
public class SqlClientRepository : Repository<Client>, IClientRepository { ... }
...控制器回報_clientRepository我的空值。有沒有辦法做到這一點,或者這是不可能的?我覺得我已經嘗試了很多變化,並且無法做到。
再次感謝您的幫助。
這很簡單,其實 - 就像我說的 - 只是使'ClientController'取決於'庫'(或更好,但'IRepository ')和寄存器你的'SqlClientRepository'作爲'IRepository ',以便它們匹配,就是這樣。 –
2010-06-13 11:25:16
好的,我終於明白了,是的,這很簡單。配置仍然如上,SqlClientRepository現在仍然繼承自Repository,但我設置ClientController依賴於IRepository ,並且一切正常。 非常感謝您的幫助。非常感謝。 –
Robin
2010-06-13 15:02:41