[英]Passing a SqlConnection to class library file (dll)
我正忙於用C#開發一個類庫項目,以便將來重用並附加到其他項目中。 它主要用於表值參數。 我的問題是,如何將SQL連接傳遞給它? 該連接將在.dll附加到的另一個(主項目)中實例化。
我目前有一個類庫項目,並且在相同的解決方案中創建了一個控制台應用程序項目以進行專門的測試。
最后一個要求是,我不想使用ConfigurationManager,因為連接字符串不會存儲在app.config或web.config中,並且默認情況下,查詢必須傳遞回調用應用程序。
我遇到了如下所示的幾個鏈接,但我沒有什么真正可以使用的:
請原諒,我已經進入專業編程課程7周了。
在您的dll中,只需要一個IDbConnection
或IDbCommand
。 然后,根據接口正確地抽象所有方法以進行數據訪問。
例如:
在您共享的dll中
public static int LookUpIntForSomething(IDbConnection connection)
{
using (var command = connection.CreateCommand())
{
// use command.
}
}
在您的通話應用中
using (var connection = new SqlConnection("ConnectionString"))
{
var int = DbQueries.LookupIntForSomething(connection);
}
這是依賴注入的絕佳示例。 我建議將企業庫統一用於此類內容。 在您的數據訪問層庫中,我將定義接口:
public interface IConnectionProvider {
string ConnectionString { get; }
}
public interface IAccountProvider {
Account GetAccountById(int accountID);
}
internal class AccountProvider : IAccountProvider {
private IConnectionProvider _connectionProvider;
public AccountProvider(IConnectionProvider connectionProvider) {
if (connectionProvider == null) {
throw new ArgumentNullException("connectionProvider");
}
_connectionProvider = connectionProvider;
}
public Account GetAccountById(int accountID) {
Account result;
using(var conn = new SqlConnection(connectionProvider)) {
// retrieve result here
}
return result;
}
}
public static class Bootstrapper {
public static void Init() {
ServiceLocator.AddSingleton<IAccountProvider, AccountProvider>();
}
}
然后,在任何使用數據訪問庫的程序集中,您都可以為IConnectionProvider定義實現,如下所示:
internal class WebConnectionProvider : IConnectionProvider {
public string ConnectionString { get { return "Server=..."; } }
}
internal static class WebBootstrapper {
public static void Init() {
Bootstrapper.Init();
ServiceLocator.AddSingleton<IConnectionProvider, WebConnectionProvider>();
}
}
在程序集中調用WebBootstrapper.Init()之后的任何地方,都可以使用:
var accountProvider = ServiceLocator.Resolve<IAccountProvider>();
accountProvider.GetAccountById(1);
服務定位器:
using System;
using Microsoft.Practices.Unity;
public class ServiceLocator {
private IUnityContainer m_Container = new UnityContainer();
public void Add<TFrom, TTo>() where TTo : TFrom {
m_Container.RegisterType<TFrom, TTo>();
}
public void BuildUp<T>(T instance) {
m_Container.BuildUp<T>(instance);
}
public void BuildUp(Type type, object instance) {
m_Container.BuildUp(type, instance);
}
public void AddSingleton<TFrom, TTo>() where TTo : TFrom {
m_Container.RegisterType<TFrom, TTo>(new ContainerControlledLifetimeManager());
}
public void AddInstance<T>(T instance) {
m_Container.RegisterInstance<T>(instance);
}
public T Resolve<T>() {
return m_Container.Resolve<T>();
}
private static ServiceLocator m_Instance;
public static ServiceLocator Instance {
get { return m_Instance; }
}
static ServiceLocator() {
m_Instance = new ServiceLocator();
}
}
如果我正確地理解了您的要求,我不確定我會這樣做,我會像這樣設置一個靜態結構
public static struct ConnectionString
{
public int ID;
public string Connection;
public override string ToString()
{
return Connection;
}
public static ConnectionString DataBase1 = new ConnectionString{ ID = 1 , Connection = "YourConnectionStringhere"};
public static ConnectionString DataBase2 = new ConnectionString{ ID = 2 , Connection = "YourConnectionString2here"};
}
然后這樣使用它
public void SomeMethod()
{
var I = ReferencedDll.DoSomething(ConnectionString.DataBase1.ToString());
}
要么
public void SomeMethod()
{
var ClassFromDll = new ReferencedDll.SomeClass(ConnectionString.DataBase1.ToString());
ClassFromDll.DoSomething();
}
當然,這會使您的連接字符串硬編碼,這並不理想
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.