用于依赖关系注入的运行时数据
本文关键字:运行时 数据 注入 依赖 关系 用于 | 更新日期: 2023-09-27 18:33:05
>我有以下界面
public interface ISender
{
void SendMessage(string msg);
}
以及以下实现
public class EmailSender : ISender
{
private EmailSettings _emailSettings;
EmailSender(EmailSettings _emailSettings)
public SendMessage(string msg);
}
public class EventLogSender : ISender
{
void SendMessage(string msg);
}
public class QuerySetting
{
string statementToExecute;
int MStoWaitBeforeExecute;
// if set to true then use email settings to perform notification through email
bool UseEmail;
EmailSettings EmailSettings;
}
public class EmailSettings
{
string serverip;
int port;
string username;
string password;
string MailToAddress;
}
在运行时,查询列表将加载到应用程序中。 每个查询都包含有关执行查询的频率的信息、有关何时为查询触发警报的信息,以及有关在发生警报时向谁发送电子邮件的电子邮件信息(或者如果未设置,警报应仅写入事件日志)。 如何在运行时使用依赖注入来了解要创建的 ISender 的哪个实例(电子邮件发件人或事件日志发件人),如果他们选择使用电子邮件通知而不是事件日志通知,还要为查询更新适当的电子邮件设置?**注意:查询可以有不同的通知方法,1 可以是偶数日志通知,而其他可以全部是电子邮件。
我不确定依赖注入是你需要的,看看
Activator.CreateInstance
http://msdn.microsoft.com/en-us/library/d133hta4.aspx
并在请求中包装一些逻辑以确定类型。您也可以使用反射。
编辑
综上所述,您不能只创建两个对象实例并根据 if/else 语句传递消息吗?
第二次编辑
经过进一步思考(双关语),我认为您需要的是工厂方法模式:
http://en.wikipedia.org/wiki/Factory_method_pattern
例:
public class ObjectFactory
{
public static IObjectController CreateObjectController(ObjectSettings settings)
{
IObjectController result = (settings.PINK ? new PinkObject() : (IObjectController) new BlueObject());
result.Initialise(settings);
return result;
}
}
如何在运行时使用依赖注入来了解要创建的 ISender 的哪个实例(电子邮件发件人或事件日志发件人),如果他们选择使用电子邮件通知而不是事件日志通知,还要为查询更新适当的电子邮件设置?
您可以注入基于运行时数据创建Sender
的SenderConstructor
/SenderFactory
。
class Controller
private readonly SenderConstructor as func(of QuerySetting, ISender)
public sub new(SenderConstructor as func(of QuerySetting, ISender))
me.SenderConstructor = SenderConstructor
end sub
public function Send(Message as string, Settings as QuerySetting) as Unit
dim Sender = SenderConstructor(Settings)
Sender.SendMessage(Message)
end function
end class
SenderConstructor
在程序的最高级别定义,并在 IoC 容器中注册(容器中的注册不会显示,因为它特定于容器):
dim SenderConstructor =
function(Settings as QuerySetting) as ISender
return if(Settings.UseEmail, new EmailSender(Settings.EmailSettings), new EventLogSender)
end function
创建Controller
时,IoC 容器会将SenderConstructor
注入其中。