csla - 升级到 CSLA 6:ConnectionManager 问题

我们正在尝试升级到 CSLA 6. 现在,我们收到一条消息:“ConnectionManager 已过时,使用依赖注入...使用 ApplicationContext.LocalContext”

for this code:

 using (var ctx = ConnectionManager<OracleConnection>.GetManager("dbEndpoint", true))

我们已经尝试过这个代码片段,但所有连接都是 NULL。您能否帮助我们正确获取连接?

var services = new ServiceCollection();
   services.AddCsla();
    
   var provider = services.BuildServiceProvider();
    
   DataPortalFactory = provider.GetRequiredService<IDataPortalFactory>();
   var appContext = provider.GetRequiredService<Csla.ApplicationContext>();
    
    
var conn1 = appContext.LocalContext.GetValueOrNull("dbEndpoint");
var conn2 = appContext.LocalContext.GetValueOrNull("__db:default-dbEndpoint");
    
var conn3 = appContext.LocalContext["dbEndpoint"];
var conn4 = appContext.LocalContext["__db:default-dbEndpoint"];

另一个实验:

....
                var CONNECTION_ORACLE = new OracleConnection(ConfigurationManager.ConnectionStrings["dbEndpoint"].ConnectionString);

                services.AddScoped<IDbConnection>(o => CONNECTION_ORACLE);
....
var provider = services.BuildServiceProvider();
...
var connectionResolved = provider.GetRequiredService<IDbConnection>();

                appContext.LocalContext.Add("dbEndpoint", connectionResolved);

那么连接不为空;

工厂内部由 DI 成功解决:

public DocFactory(ApplicationContext appContext, IDbConnection connection) : base(
    appContext)
{
    _connection = connection;
}

然后

[Fetch]
public Doc_Fetch(DocCriteria criteria)
{
    bool cancel = false;
    OnFetching(criteria, ref cancel);
    if (cancel) return null;

    Doc item = null;

    OracleConnection connection = _connection as OracleConnection;

连接已关闭(但不为空!!)。可以打开它,但如果关闭它,使用它的其他人将面临问题,或者子对象也将面临关闭连接的问题。因此,使 ConnectionManager 过时可能不是那么明显的方法。但是 ConnectionManager 对于计算打开的连接、支持事务等非常有用,您能否提供一个解决方法。更多尝试:

var connectionString = 
ConfigurationManager.ConnectionStrings["dbEndpoint"].ConnectionString;
..
 appContext.ClientContext.Add("DBConnectionString", connectionString );
...
Factory
           using (var connection = new OracleConnection(ApplicationContext.ClientContext["DBConnectionString"].ToString()))

            {
                connection.Open();

回答1

您的 DAL 应该要求注入数据库连接。

public class MyDal : IDisposable
{
  public MyDal(OracleConnection connection)
  {
    Connection = connection;
  }

  private OracleConnection Connection { get; set; }

  public MyData GetData()
  {
    // use Connection to get the data
    return data;
  }

  public void Dispose()
  {
    Connection.Dispose();
  }
}

然后在应用服务器启动代码中,注册您的 DAL 类型并注册您的连接类型。

services.AddScoped(typeof(OracleConnection), () =>
    {
      // initialize the connection here
      return connection;
    });
  services.AddScoped<MyDal>();

然后,在你的数据门户操作方法(如create、fetch等)中,注入你的DAL:

[Fetch]
  private void Fetch([Inject] MyDal dal)
  {
    var data = dal.GetData();
  }

相似文章

c++ - 服务器在发送大量数据时被中断

当我优雅地关闭连接到它的客户端时,我的服务器崩溃了,而客户端正在接收大量数据。我正在考虑一个可能的终身错误,就像boostASIO中的大多数错误一样,但是我自己无法指出我的错误。每个客户端与服务器建立...

r - Average duration 的时间花费 R

我正在尝试编写一个可以计算行为事件的averageduration的脚本。理想情况下,可以为我所有的行为类别进行计算,如果可能的话,还可以计算标准误差。我的数据如下29/10/20156:09:389...

最新文章