例如,我创建WPF应用程序并希望添加一些我在每个应用程序中使用的逻辑 - 例如日志记录,未处理的异常处理等。我使用这样的代码(它实际上并不重要) - 在我的示例WPF应用程序中只是执行某些操作的代码:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException
+= new UnhandledExceptionEventHandler(UnhandledExceptionHandler);
ServiceInjector.InjectServices();
base.OnStartup(e);
MainWindow window = new MainWindow();
window.Show();
}
void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args)
{
var exceptionObj = args.ExceptionObject as Exception;
if (exceptionObj == null)
exceptionObj = new NotSupportedException(
"Unhandled exception doesn't derive from System.Exception: "
+ args.ExceptionObject.ToString());
// TODO: Logging...
var messageBox = GetService<IMessageBoxService>();
messageBox.Show(
exceptionObj.Message,
"Unhandled exception.",
MessageBoxButton.OK,
MessageBoxImage.Exclamation);
Environment.Exit(1);
}
#region Resolve service dependencies members.
public TServiceContract GetService<TServiceContract>()
where TServiceContract : class
{
return ServiceContainer.Instance.GetService<TServiceContract>();
}
#endregion Resolve service dependencies members.
}
我想在我的所有WPF应用程序中使用OnStartup(UnhandledException订阅,注入服务),UnhandledExceptionHandler本身和GetService方法中的一些代码,而无需手动复制粘贴。什么是最好的方式?
我已经阅读了一些关于App的基类(从Application派生),但它似乎有许多缺点,如App.gics文件的问题(App类声明的一部分),XAML支持(需要有) App.xaml,因为Fluent的组件不想在没有通过App.xaml内的ResourceDictionary添加引用的情况下工作,等等。
答案 0 :(得分:2)
如果要跨项目重用代码(尤其是跨项目类型:wpf,winforms,console,web等),您可能需要研究创建单独的类库项目。这些类型的项目没有用户界面/应用程序:它们被编译为DLL文件,然后您可以根据需要在其他.NET项目中引用它们。
或者,在同一解决方案中,您可以拥有多个项目。在它们之间设置了许多具有依赖关系的项目并不罕见,因此同一解决方案中的两个不同的应用程序项目都使用另一个类库项目来共享代码库。
见下文:
这是我使用的典型Web应用程序项目模板。 Domain项目位于依赖关系链的底部,由所有其他项目引用的业务对象组成。 Data项目包含其他项目可以访问的数据访问代码(Domain除外)。 Web是Web应用程序,Services是基于服务器的实用程序等的控制台应用程序。它们共享相同的域和数据(以及其他一些)项目。
在上述情况下,在我的Web项目中,我设置了对DomainServices项目的引用,然后在我的Web项目中执行类似的操作:
using System;
using Template.DomainServices;
namespace Template.Web {
public class MyClass {
ILogger logger = new DomainServices.DefaultLogger();
public void Log(string msg) {
logger.Log(msg);
}
}
}
我们现在正在使用DomainServices共享项目中的记录器实现,从Web项目调用它,我们也可以对我们想要的任何其他项目执行相同的操作(授予,这在技术上不是最重要的)根据所显示的代码更正,但你明白了吗?)
也许这可以提供一些关于如何处理这个问题的想法?
从WPF基类(或任何特定于应用程序平台的类)派生的一个复杂因素是您的库类现在与该特定应用程序平台相关联。在某些情况下,如果所需功能特定于该平台,则可能需要这样做。在其他情况下,例如记录器等(以及许多其他东西),它们可以是任何应用程序平台都可以使用的普通旧C#对象(POCO)。目标通常是编写与平台无关的库,除非有特定需要定位或扩展特定平台。