例如,我创建了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.
}我想在我所有的UnhandledException应用程序中使用OnStartup (UnhandledException订阅,注入服务)、UnhandledExceptionHandler本身和GetService方法中的一些代码,而不是手动复制粘贴它们。最好的方法是什么?
我读过一些关于App的基类(从应用程序派生),但它似乎有很多缺点,比如App.g.i.cs文件( App类声明的一部分),XAML支持(需要有App.xaml,因为Fluent的组件不想在没有通过ResourceDictionary在App.xaml中添加引用的情况下工作),等等。
发布于 2016-06-11 11:17:09
如果你想跨项目重用代码(尤其是跨项目类型: wpf、winforms、console、web等),你可能会考虑创建一个单独的类库项目。这些类型的项目没有用户界面/应用程序:它们被编译成DLL文件,然后您可以根据需要在其他.NET项目中引用这些文件。
或者,在同一解决方案中,您可以有多个项目。许多项目之间设置了依赖关系,使得同一解决方案中的两个不同应用程序项目都使用另一个类库项目作为共享代码库,这种情况并不少见。
如下所示:

这是我使用的一个典型的web应用程序项目模板。域项目位于依赖链的底部,由所有其他项目引用的业务对象组成。数据项目包含其他项目可以访问的数据访问代码(域除外)。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#对象(POCOs)。目标通常是编写与平台无关的库,除非有特定的目标或扩展特定的平台。
https://stackoverflow.com/questions/37759534
复制相似问题