例如
public class StreamingSubscriber{ private Readonly ILogic _logic; public StreamingSubscriber(ILogic logic) { _logic = logic; // Not sure I like this... _logic.StreamingSubscriber = this; } public voID OnNotificationEvent(object sender,NotificationEventArgs args) { // Do something with _logic var email = _logic.FetchEmail(args); // consume the email (omitted for brevity) }}public class ExchangeLogic : ILogic{ public StreamingSubscriber StreamingSubscriber { get; set; } public voID Subscribe() { // Here is where I use StreamingSubscriber streamingConnection.OnNotificationEvent += StreamingSubscriber.OnNotificationEvent; } public IEmail FetchEmail(NotificationEventArgs notificationEventArgs) { // Fetch email from Exchange }}
如果这是一个代码气味你怎么去修复它?
编辑
我选择这个实现的原因是因为我想要测试当来自ExchangeLogic的streamingConnection被调用时它会消耗该电子邮件.目前的设计虽然不完美,但允许我编写类似这样的测试.
[Test] public voID FiringOnNotificationEvent_WillConsumeEmail() { // Arrange var subscriber = new StreamingSubscriber(ConsumerMock.Object,ExchangeLogicmock.Object); // Act subscriber.OnNotificationEvent(It.IsAny<object>(),It.IsAny<NotificationEventArgs>()); // Assert ConsumerMock.Verify(x => x.Consume(It.IsAny<IEmail>()),Times.Once()); }
现在,如果没有进行完整的集成测试,这显然是无法实现的.如果我告诉我的ExchangeLogic消费电子邮件.
解决方法 它不会把我当成代码气味本身,不.但是,通过设置器进行此工作会产生一个您可能遇到计时问题的情况 – 如果有人拨打订阅并且尚未设置StreamingSubscriber?现在你必须编写代码来防范.我会避免使用setter并重新排列,这样就可以调用“_logic.Subscribe(this)”.
总结以上是内存溢出为你收集整理的c# – 它是一个代码气味来注入一个依赖关系并将其成员设置为“这”?全部内容,希望文章能够帮你解决c# – 它是一个代码气味来注入一个依赖关系并将其成员设置为“这”?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)