实现接口以在应用程序启动时运行代码
本文关键字:运行 代码 启动 应用程序 接口 实现 | 更新日期: 2023-09-27 18:00:21
很抱歉遇到麻烦了,我在这里把它重新表述为一个新问题:MVC:在应用程序启动时运行一个方法,而不从Application_Start 调用它
这可能是一个非常简单的问题,但使用方法OnStartup
的接口的最佳方式是什么。实现此接口时,OnStartup()
代码应在application_start上运行。
编辑:我实际上正在尝试创建一个HttpModule或其他东西,这样当我实现这个模块的特定类时,这个类就会有一个方法,通过重写这个方法,我将能够在应用程序启动时运行它的代码。
我唯一的问题是,我不想直接从application_start方法调用任何代码。
附言:如果有免费的包裹,请告诉我名字。
定义您的接口和类:
interface IOnStartup
{
void OnStartup();
}
class YourClass : IOnStartup
{
public void OnStartup()
{
}
}
加载项Global.asax
public void Application_OnStart()
{
var cls = new YourClass();
cls.OnStartup();
}
您不能通过实现接口来运行任何代码,您可以强制您的类实现OnStartup
方法的代码
interface IOnStartup
{
void OnStartup();
}
class MyClass : IOnStartup
{
public void OnStartup()
{
// your code for OnStartUp method
// you are forced to implement the code for this method because your class implement IOnStartup
}
}
或者,您可以定义一个实现此代码的抽象类,并从该抽象类继承所有应该具有该方法的类。
abstract class OnStartUpClass
{
public void OnStartup()
{
// the code for this method
}
}
class MyClass : OnStartUpClass
{
// implement code for this class
// you already have this method in your class
}
我认为您想要做的是无法通过实现接口来实现的。你应该选择另一种方法。
如果我理解正确,如果有一个类实现了一个给定的接口,你希望该类被实例化,并调用它的OnStartup方法。如果这就是你想要做的,那么你必须依靠反思。
在Application_Start中,调用一个方法,该方法将加载程序集中存在的所有类型,并检查其中是否有任何类型实现了该接口。如果找到,您可以实例化它的实例并调用该类上的方法。
如果你想在不重新编译自己的应用程序的情况下动态添加类,那么它会变得更复杂,需要创建AppDomains,但这也是可行的。
编辑
stackoverflow上的这个问题告诉您如何获得实现接口的所有类:
获取实现接口的所有类型
我会使用像Autofac、Ninject、Unity这样的IOC容器。然后,您可以向框架注册接口,并使用服务定位器返回实现该接口的类的所有实例。
//using Autofac
var builder = new ContainerBuilder();
containerBuilder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
var container = builder.Build();
var myItems = Container.Resolve<ISomeInterface>();
foreach(var item in myItems){
item.DoSomething()
}