我有一个网应用程序,包括如下:

  • 一个网络项目(一个网络。配置文件含有一连串的-但是没有数据的访问代码网项目)
  • 数据存取项目使用的皇宫-SQL类提供的实体的网项目UI(该项目已经设置一个文件和一个应用程序。config-两者都具有连字符串)

当我建立和部署,也没有设置文件或应用程序。config在该站的目录与数据访问。dll,但改变的连字符串中的网站。配置文件并没有改变的数据库中的相应-所以连串必须编入数据访问dll。

我需要的是一个配置文件为我的整个部署的网站、数据访问dll,一切-那有一连串的其得到使用。目前有出现多种连串越来越使用或硬编码,所有的地方。

我如何能最好地解决这个烂摊子?

谢谢你任何帮助。

有帮助吗?

解决方案

我从来没有过问题 数据存取层 (DAL)能够使用连串的自我 web.config 文件。通常我只是复制连接串部分,从达尔和粘贴到 web.config.我使用的是申请设计者创造的数据上下文。

如果这不会为你工作,你可以指定连串的数据方面的构造。在你的网的项目有一个类的静态加载设置,包括连接串,并在创建达尔对象(或数据方面,如果创建这直接)只是通过它在构造。

public static class GlobalSettings
{
    private static string dalConnectionString;
    public static string DALConnectionString
    {
       get
       {
           if (dalConnectionString == null)
           {
              dalConnectionString = WebConfigurationManager
                                      .ConnectionStrings["DALConnectionString"]
                                        .ConnectionString;
           }
           return dalConnectionString;
       }
    }
}
...

using (var context = new DALDataContext(GlobalSettings.DALConnectionString))
{
   ...
}

其他提示

配置文件,用于启动项目将定义的结构设置,包括所有项目。例如,如果你网络项目的启动项目,任何提到"若"将寻找设置网。配置,这包括任何提到"若"数据存取项目。所以复制任何配置的设置数据存取项目的应用程序。config的网项目的网络。config。

滚你自己的连接工厂根据注册表中:

  • 增加一个注册表中的关键你的应用程序软件/[YOUR_COMPANY]/[YOUR_APP]
  • 添加一串的价值。
  • 教你的连接工厂裂开的适当的注册键(在一个静态的构造,不是每页载!).
  • 出口的注册信息。reg文件,增加它来源的控制、修改和适用它,因为需要设立额外的机器。

专业:

  • 简单的设置
  • "连接字符串"生活在一个地方
  • 不在web/应用程序。配置,因此没有必要硬编码环境的具体设置。
  • 不在web/应用程序。配置,使少年Dev吉米不能不小心告诉你的生产服务器上看,在开发数据库

Con:

  • 不能立即显而易见的,重要的事情是生活在注册,使新的开发人员将需要说明。
  • 额外的步骤时配置一个新的部署时机
  • 登记册是oldskool.小型开发者会嘲笑你。

谢谢你的回应。

那些你说的应用程序将使用该设置在网络上。配置是否正确情况下我引用它在我自己的代码:

_connectionString = ConfigurationManager.AppSettings["ConnectionString"];

..但是有一个不同的问题与皇宫-SQL datacontexts-我认为他们包括连串在编制dll使用的无参构造。作为tvanofosson说,我需要创建datacontexts通过在一个参考连字符串中的网站。config。这是我在那里越来越成为一个纠缠:)

我有一点的斗争,这一问题。我找到一个解决方案,通过使用c#分类定义和延伸的属性创造了通过申请的设计师。这个解决方案相当类似于tvanfosson的答复。你有什么要做的是建立分类属性与默认构造变。从设置的,在申请设计DC性设置连接。这种方式连串不会被编成dll。属性将自动获得连串从网。config"连接字符串"设置。我没有测试,如果该工作与应用程序。config还,但我认为它应该做工精细。

这是样品的部分DC类:

namespace MyApplication {
    /// <summary>
    /// Summary description for MyDataContext
    /// </summary>
    /// 
    public partial class MyDataContext
    {
        public MyDataContext() :
            base(global::System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString, mappingSource)
        {
            OnCreated();
        }
    }
}

你的应用程序将仅使用配置项目中的网站。配置文件。你可以把dll配置设置在网络上。配置文件,只要它们的结构正确。我的例子是VB具体使用我的名字空间,但它给你一般想法。

在configSections paret的配置文件,你会需要一个条目:

<configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="YourAssembly.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup></configSections>

然后在应的一部分的配置文件,你把该条目的每个dll:

    <applicationSettings>
      <YourAssembly.My.MySettings>
        <setting name="DebugMode" serializeAs="String">
            <value>False</value>
        </setting>
      </YourAssembly.My.MySettings>
    </applicationSettings>  

以保证它的安全任何自动产生的代码,复盖连接信息的OnCreated()方法的数据的情况下:

using System.Configuration;
namespace MyApplication 
{
    partial void OnCreated()
    {
        // attempt to use named connection string from the calling config file
        var conn = ConfigurationManager.ConnectionStrings["MyConnectionString"];
        if (conn != null) Connection.ConnectionString = conn.ConnectionString;
    }
}

这种方式的申请设计师可以不连接的东西,其方式(它不是很好的外网项目),但是你抓的最终控制的连接应用程序时运行。

这里的一种方法来看待它。其组成应该做的决定关于数据库使用?这是可能的,该数据库(或至少连串)可能会改变未来。没有网站的决定哪些数据库使用?或者,不在达尔决定?

如果你有开发、质量保证、UAT和生产数据库,管理这些连串至关重要。

如果该网站的决定,它应该通过连串从其网站。config到达尔。如果该网站是不是应该知道或关心的数据来自,然后连串属于在达尔。

关于如何确定一个连接工厂的对象,这需要一个枚举,作为一个参数和返回一个完全形成连接的对象?

你也可以有的网络应用程序提供连串的时需要使用的数据存取项目。你可以让它的部分的构造。

还有,你可以可以只写自己的逻辑载的一连串自一个外部文件时数据存取项目使得它的呼叫。

在一个完美的世界中,我认为你会重构你的数据层挑选了结构设置,通过系统。配置或有关的构造/工厂。这意味着,你要么需要重新布线,其隐含的结构源,或明确设置的连接,从其宿主/消费者。另一个相关的模式为集中处理这些类型的常数是扔一个只读酒店入一个静态的助手类和具有这类管理的实际决议从配置,等等。

一个地方你可以看看,我认为显示出良好的例子如何做到这一优雅的是它能够与其配置/映射的管理。当然,它是一个有点xml地狱,流利的NHib是更多的含糖,但大多数的现实世界样会告诉你如何调和配置一个支持大会与执行组件。

滚你自己的连接工厂的基础上。配置文件:

  • 定义一个自定义的配置部分到地图键。对
  • 教你的连接工厂以嗅到那配置部分使用的主机名或计算机名为合适
  • 填充键。值的各种dev/qa/prod服务器,并把它们放到你的各种应用程序。config,网。config等。文件。

专业:

  • 所有的生命内部的项目,所以没有惊喜
  • 增加额外部署的目标是一个复制、粘贴的操作中的一个。配置文件

Con:

  • 使得大丑XML部分,尤其是如果你有十几个生产服务器
  • 需要将重复的项目之间
  • 需要代码变化和重新部署增加新的目标
  • 代码需要知道的环境中,它将住

我知道这是旧的,但这里是我是如何做到这一点(我很喜欢@西巴的方式,但我没有试过)

这个假设你的申请文件驻留在其自己的类图书馆,这我已经找到了最方便的分享的时候实体和数据存在多个网站和其他类库。它还假定你已经叫你连串的同样在每一个项目。我用NAnt设置这个当我要部署到不同的环境。

我基本上顶以上的答案,从@tvanfosson-荣誉给那个家伙。

  1. 创建你自己的基类,这源自LinqDataContext

这里的VB码:

    Imports System.Configuration

Public Class CustomDataContextBase
    Inherits System.Data.Linq.DataContext
    Implements IDisposable

    Private Shared overrideConnectionString As String

    Public Shared ReadOnly Property CustomConnectionString As String
        Get
            If String.IsNullOrEmpty(overrideConnectionString) Then
                overrideConnectionString = ConfigurationManager.ConnectionStrings("MyAppConnectionString").ConnectionString
            End If

            Return overrideConnectionString
        End Get
    End Property

    Public Sub New()
        MyBase.New(CustomConnectionString)
    End Sub

    Public Sub New(ByVal connectionString As String)
        MyBase.New(CustomConnectionString)
    End Sub

    Public Sub New(ByVal connectionString As String, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource)
        MyBase.New(CustomConnectionString, mappingSource)
    End Sub

    Public Sub New(ByVal connection As IDbConnection, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource)
        MyBase.New(CustomConnectionString, mappingSource)
    End Sub

End Class
  1. 打开你的申请文件,在性能,加上述类名称的基类财产。

注意,如果你放的定义数据方面的类在同一个大会,只需包括的类的名称,例如CustomDataContext.

如果他们是在不同的组件,使用完全限定名称,例如杜玉.MyApp。数据。CustomDataContext

  1. 为确保设计的东西正常工作,复制连接串入的应用程序。配置文件的类图书馆。这不会用除了在IDE。

就是这样。

你会需要的名字你连串的同

什么你基本上是这样做是迫使数据方面忽略的连接信息集中的申请文件。使用ConfigurationManager方法将意味着它会挑起的连串从调会。

禾田

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top