繁体   English   中英

将SqlConnection传递给类库文件(dll)

[英]Passing a SqlConnection to class library file (dll)

我正忙于用C#开发一个类库项目,以便将来重用并附加到其他项目中。 它主要用于表值参数。 我的问题是,如何将SQL连接传递给它? 该连接将在.dll附加到的另一个(主项目)中实例化。

我目前有一个类库项目,并且在相同的解决方案中创建了一个控制台应用程序项目以进行专门的测试。

最后一个要求是,我不想使用ConfigurationManager,因为连接字符串不会存储在app.config或web.config中,并且默认情况下,查询必须传递回调用应用程序。

我遇到了如下所示的几个链接,但我没有什么真正可以使用的:

共享连接字符串

请原谅,我已经进入专业编程课程7周了。

在您的dll中,只需要一个IDbConnectionIDbCommand 然后,根据接口正确地抽象所有方法以进行数据访问。

例如:

在您共享的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM