클래스 라이브러리 용 app.config
VS2008 마법사에서 클래스 라이브러리에 대해 생성 된 app.config 파일을 볼 수 없습니다. 내 연구에서 응용 프로그램에는 app.config가 하나만 존재한다는 것을 발견했습니다.
app.config를 클래스 라이브러리에 수동으로 추가하는 것이 나쁜 일입니까? 아니면 클래스 라이브러리에서 app.config의 목적을 제공하는 다른 메서드가 있습니까?
app.config 파일에 log4net 구성 정보를 저장해야합니다.
일반적으로 클래스 라이브러리 프로젝트에 파일을 추가 해서는 안됩니다app.config
. 고통스러운 구부리거나 뒤틀림 없이는 사용되지 않습니다. 그것은 도서관 프로젝트를 전혀 해치지 않습니다. 단지 아무것도하지 않을 것입니다.
대신 라이브러리를 사용하는 응용 프로그램을 구성합니다. 따라서 필요한 구성 정보가 여기로 이동합니다. 라이브러리를 사용할 수있는 각 응용 프로그램에는 다른 요구 사항이있을 수 있으므로 실제로 논리적으로도 의미가 있습니다.
이 답변이 아직 제공되지 않은 이유를 모르겠습니다.
동일한 라이브러리의 다른 호출자는 일반적으로 다른 구성을 사용합니다. 이는 구성 이 클래스 라이브러리가 아닌 실행 가능한 응용 프로그램 에 있어야 함을 의미합니다 .
클래스 라이브러리 프로젝트 내에서 app.config를 만들 수 있습니다. 라이브러리 내에서 생성 한 항목에 대한 기본 구성이 포함됩니다. 예를 들어 클래스 라이브러리 내에서 Entity Framework 모델을 만드는 경우 연결 문자열이 포함됩니다.
그러나 이러한 설정은 라이브러리를 호출하는 실행 가능한 응용 프로그램에서 사용되지 않습니다. 대신 이러한 설정을 library.dll.config 파일에서 호출자의 app.config 또는 web.config로 복사하여 호출자 및 호출자가 속한 환경에 맞게 변경할 수 있습니다. 배포.
이것이 1 일차부터 .NET과 함께 해왔습니다.
Jon, 귀하의 질문에 올바르게 대답하지 않은 많은 의견이 제공되었습니다.
나는 내 의견을 제시하고 요청한 것을 정확히 수행하는 방법을 알려줄 것입니다.
어셈블리에 자체 구성 파일이 없을 이유가 없습니다. 원자 성의 첫 번째 수준 (실제 단어입니까?)이 애플리케이션 수준에있는 이유는 무엇입니까? 솔루션 수준이 아닌 이유는 무엇입니까? 그것은 임의적이고 최선의 결정이며 따라서 의견입니다. 로깅 라이브러리를 작성하고 이에 대한 구성 파일을 포함하려는 경우 전역 적으로 사용되는 경우 내장 설정 기능에 연결할 수없는 이유는 무엇입니까? 우리는 모두 해냈습니다. 다른 개발자에게 "강력한"기능을 제공하려고 노력했습니다. 어떻게? 본질적으로 제한으로 해석 된 가정을합니다. MS가 설정 프레임 워크로했던 것과 정확히 같으므로 약간 "만약"해야합니다.
질문에 직접 답하려면 구성 파일 (xml)을 수동으로 추가하고 라이브러리와 일치하고 "config"확장자를 포함하도록 이름을 지정하십시오. 예:
MyDomain.Mylibrary.dll.Config
다음으로 ConfigurationManager를 사용하여 파일을로드하고 설정에 액세스합니다.
string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath);
string result = cfg.AppSettings.Settings["TEST_SETTING"].Value;
앱 구성 파일을 명시 적으로 선택 했더라도 이것은 machine.config 계층 구조를 완전히 지원합니다. 즉, 설정이 없으면 더 높게 해결됩니다. 설정은 machine.config 항목도 무시합니다.
클래스 라이브러리를 사용하는 동안 log4Net을 사용하여 프로젝트 로깅을 구성하려는 경우 실제로 구성 파일이 필요하지 않습니다. 클래스에서 log4net 로거를 구성하고 해당 클래스를 라이브러리로 사용할 수 있습니다.
log4net은이를 구성하는 모든 옵션을 제공합니다.
아래 코드를 찾으십시오.
public static void SetLogger(string pathName, string pattern)
{
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = pattern;
patternLayout.ActivateOptions();
RollingFileAppender roller = new RollingFileAppender();
roller.AppendToFile = false;
roller.File = pathName;
roller.Layout = patternLayout;
roller.MaxSizeRollBackups = 5;
roller.MaximumFileSize = "1GB";
roller.RollingStyle = RollingFileAppender.RollingMode.Size;
roller.StaticLogFileName = true;
roller.ActivateOptions();
hierarchy.Root.AddAppender(roller);
MemoryAppender memory = new MemoryAppender();
memory.ActivateOptions();
hierarchy.Root.AddAppender(memory);
hierarchy.Root.Level = log4net.Core.Level.Info;
hierarchy.Configured = true;
}
Now instead of calling XmlConfigurator.Configure(new FileInfo("app.config")) you can directly call SetLogger with desired path and pattern to set the logger in Global.asax application start function.
And use the below code to log the error.
public static void getLog(string className, string message)
{
log4net.ILog iLOG = LogManager.GetLogger(className);
iLOG.Error(message); // Info, Fatal, Warn, Debug
}
By using following code you need not to write a single line neither in application web.config nor inside the app.config of library.
In fact, the class library you are implementing, is retrieving information from app.config inside the application that is consuming it, so, the most correct way to implement configuration for class libraries at .net in VS is to prepare app.config in the application to configure everything it consumes, like libraries configuration.
I have worked a little with log4net, and I found that the one who prepared the application always had a section for log4net configuration inside main app.config.
I hope you find this information useful.
See you, and post comments about the solution you found.
EDIT:
At the next link you have an app.config with the section for log4net:
http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx
Actually, for some rare case you could store app.config in class libraries (by adding manually) and parse it by OpenExeConfiguration.
var fileMap =
new ExeConfigurationFileMap {ExeConfigFilename =
@"C:\..somePath..\someName.config"};
System.Configuration.Configuration config =
ConfigurationManager.OpenMappedExeConfiguration(fileMap,
ConfigurationUserLevel.None);
You should really estimate the real need of this. For abstract data its not the best solution, but "Config Sections" could be very usefull!!
For example, we organised our N-Tier WCF architecture decoupled, without any metadata, simply by using Unity Container and Injection Factory based on Channel Factory T. We added externall ClassLibrary dll with just [Service Contract] Interfaces and common app.config in order to read endpoints from clientsection, and easily add/change them at one place.
You do want to add App.config to your tests class library, if you're using a tracer/logger. Otherwise nothing gets logged when you run the test through a test runner such as TestDriven.Net.
For example, I use TraceSource
in my programs, but running tests doesn't log anything unless I add an App.config file with the trace/log configuration to the test class library too.
Otherwise, adding App.config to a class library doesn't do anything.
Your answer for a non manual creation of an app.config is Visual Studio Project Properties/Settings tab.
When you add a setting and save, your app.config will be created automatically. At this point a bunch of code is generated in a {yourclasslibrary.Properties} namespace containing properties corresponding to your settings. The settings themselves will be placed in the app.config's applicationSettings settings.
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ClassLibrary.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<ClassLibrary.Properties.Settings>
<setting name="Setting1" serializeAs="String">
<value>3</value>
</setting>
</BookOneGenerator.Properties.Settings>
</applicationSettings>
If you added an Application scoped setting called Setting1 = 3 then a property called Setting1 will be created. These properties are becoming at compilation part of the binary and they are decorated with a DefaultSettingValueAttribute which is set to the value you specified at development time.
[ApplicationScopedSetting]
[DebuggerNonUserCode]
[DefaultSettingValue("3")]
public string Setting1
{
get
{
return (string)this["Setting1"];
}
}
Thus as in your class library code you make use of these properties if a corresponding setting doesn't exist in the runtime config file, it will fallback to use the default value. That way the application won't crash for lacking a setting entry, which is very confusing first time when you don't know how these things work. Now, you're asking yourself how can specify our own new value in a deployed library and avoid the default setting value be used?
That will happen when we properly configure the executable's app.config. Two steps. 1. we make it aware that we will have a settings section for that class library and 2. with small modifications we paste the class library's config file in the executable config. (there's a method where you can keep the class library config file external and you just reference it from the executable's config.
So, you can have an app.config for a class library but it's useless if you don't integrate it properly with the parent application. See here what I wrote sometime ago: link
There is no automatic addition of app.config file when you add a class library project to your solution.
To my knowledge, there is no counter indication about doing so manualy. I think this is a common usage.
About log4Net config, you don't have to put the config into app.config, you can have a dedicated conf file in your project as well as an app.config file at the same time.
this link http://logging.apache.org/log4net/release/manual/configuration.html will give you examples about both ways (section in app.config and standalone log4net conf file)
I would recommend using Properties.Settings to store values like ConnectionStrings and so on inside of the class library. This is where all the connection strings are stores in by suggestion from visual studio when you try to add a table adapter for example. enter image description here
And then they will be accessible by using this code every where in the clas library
var cs= Properties.Settings.Default.[<name of defined setting>];
참고URL : https://stackoverflow.com/questions/5674971/app-config-for-a-class-library
'Programing' 카테고리의 다른 글
자바 스크립트 이벤트 e. 어느? (0) | 2020.11.14 |
---|---|
UILabel 텍스트 색상을 변경할 수 없습니다. (0) | 2020.11.13 |
파이썬 : 집합의 항목을 하나의 문자열로 결합하는 방법은 무엇입니까? (0) | 2020.11.13 |
변수에 반환 된 부울을 부정하는 방법이 있습니까? (0) | 2020.11.13 |
Android의 EditText 내에서 힌트 텍스트를 중앙에 어떻게 배치합니까? (0) | 2020.11.13 |