C# 如何使用可选的程序集引用组织代码?
我正在处理一个项目,希望可以选择使用程序集(如果可用)。此程序集仅在WS2008R2上可用,我的理想产品是一个通用的二进制文件,用于有或没有该程序集的计算机。但是,我主要是在Windows 7计算机上开发,无法安装程序集。C# 如何使用可选的程序集引用组织代码?,c#,.net,assemblies,C#,.net,Assemblies,我正在处理一个项目,希望可以选择使用程序集(如果可用)。此程序集仅在WS2008R2上可用,我的理想产品是一个通用的二进制文件,用于有或没有该程序集的计算机。但是,我主要是在Windows 7计算机上开发,无法安装程序集。 我如何组织我的代码,以便在没有程序集的情况下(以最小的更改)在机器上构建代码;其次,我如何确保仅在程序集存在时调用程序集函数。 (注意:可选程序集的唯一用途是实例化库中的类,并重复调用该类的(单个)函数,该函数返回布尔值。该程序集是fsrmlib,它公开WS08R2上的高级文
我如何组织我的代码,以便在没有程序集的情况下(以最小的更改)在机器上构建代码;其次,我如何确保仅在程序集存在时调用程序集函数。
(注意:可选程序集的唯一用途是实例化库中的类,并重复调用该类的(单个)函数,该函数返回布尔值。该程序集是fsrmlib,它公开WS08R2上的高级文件系统管理操作。)
我目前正在考虑编写一个包装器类,如果程序集不存在,它将始终返回true。这是正确的方法吗?将功能隐藏在界面后面,比如:
public interface IFileSystemManager
{
void Manage(IFoo foo);
}
创建两个实现:
- 从fsrmlib包装所需功能的实现
- 不做任何事情的实现
public class Consumer
{
private readonly IFileSystemManager fileSystemManager;
public Consumer(IFileSystemManager fileSystemManager)
{
if (fileSystemManager == null)
{
throw new ArgumentNullException("fileSystemManager");
}
this.fileSystemManager = fileSystemManager;
}
// Use the file system manager...
public void Bar()
{
this.fileSystemManager.Manage(someFoo);
}
}
通过将从IFileSystemManager到具体类的映射委托给配置文件,使IFileSystemManager的选择成为配置选项,这样您就可以在不重新编译应用程序的情况下更改实现
将运行在WS 2008 R2上的应用程序配置为使用包装fsrmlib的实现,并将所有其他应用程序配置为使用空对象实现
我建议您为配置部分使用DI容器,而不是自己滚动此功能
可选地,你也可以考虑将IFLeSeSeMeMe饰件作为一个外接程序来处理,并使用它来为你提供信息。
隐藏界面后面的功能,比如说:
public interface IFileSystemManager
{
void Manage(IFoo foo);
}
创建两个实现:
- 从fsrmlib包装所需功能的实现
- 不做任何事情的实现
public class Consumer
{
private readonly IFileSystemManager fileSystemManager;
public Consumer(IFileSystemManager fileSystemManager)
{
if (fileSystemManager == null)
{
throw new ArgumentNullException("fileSystemManager");
}
this.fileSystemManager = fileSystemManager;
}
// Use the file system manager...
public void Bar()
{
this.fileSystemManager.Manage(someFoo);
}
}
通过将从IFileSystemManager到具体类的映射委托给配置文件,使IFileSystemManager的选择成为配置选项,这样您就可以在不重新编译应用程序的情况下更改实现
将运行在WS 2008 R2上的应用程序配置为使用包装fsrmlib的实现,并将所有其他应用程序配置为使用空对象实现
我建议您为配置部分使用DI容器,而不是自己滚动此功能
另外,您也可以考虑将IFLeSeSeMeMe饰件作为一个外接程序来处理,并使用它来为您提供信息。
< P>我的方法是动态加载程序集,而不是硬编码引用。然后,您的代码可以决定是使用程序集(如果已加载)还是返回其他值。如果使用程序集,则需要使用反射来实例化该类并使用该方法。这样,您的代码将在任何平台上构建和运行,但如果它检测到存在fsrmlib
,其行为将发生变化
System.Reflection.Assembly文档已经发布。我的方法是动态加载程序集,而不是硬编码引用。然后,您的代码可以决定是使用程序集(如果已加载)还是返回其他值。如果使用程序集,则需要使用反射来实例化该类并使用该方法。这样,您的代码将在任何平台上构建和运行,但如果它检测到存在
fsrmlib
,其行为将发生变化
System.Reflection.Assembly文档具有。如果动态加载引用,那么使用引用的代码将如何编译?编译器应该知道引用中是否存在类。如果动态加载引用,那么使用引用的代码将如何编译?编译器应该知道引用中是否存在类。我当前的方法与您描述的方法类似,函数返回的布尔值用于决定是否应该执行某些操作(因此,每当FSRM不存在时,我都返回true)。至于使用配置文件,我希望以某种方式动态检测库的存在。我当前的方法与您描述的方法类似,函数返回的布尔值用于决定是否应执行某些操作(因此,每当FSRM不存在时,我将返回true)。至于使用配置文件,我希望以某种方式动态检测库的存在。