c# - 创建没有构造函数注入或 ServiceLocator 的具有依赖关系的类的实例
问题描述
我有一个用 Autofac 注册的包装类 SessionData,它的构造函数中注入了 IHttpContextAccessor;然后我有一个 Parser 类,用于用来自不同来源的值替换字符串中的标记,用户可以在代码中的任何位置实例化 Parser 类的实例,但是 Parser 使用的 IAccessor 之一需要 SessionData 的实例。此代码的旧版本使用 ServiceLocator 模式;我试图不惜一切代价避免这种情况,我也不想使用构造函数注入,因为我不希望构造函数变得难以管理;谁能给我一些指导?
// 请原谅后面的伪代码中的错误
// wrapper class to access values stored in Session
public class SessionData {
public SessionData(IHttpConextAccessor) {...}
}
// class used to replace tokens in strings throughout the application
public class Parser {
public Parser() {...}
public string Parse(string value) {
...
foreach(var token in GetTokens(value)) {
if(token.type == "session") {
var accessor = new SessionAccessor();
token.value = accessor.GetValue(token.key)
// replace tokens in value
}
...
// 20 different types of accessors
}
}
}
// interface for all Accessors
public interface IAccessor {
string GetValue(string key);
}
// Accessor to get values from Session
public class SessionAccessor {
SessionData _sessionData;
public SessionAccessor(SessionData sessionData) {
_sessionData = sessionData;
}
}
解决方案
推荐阅读
- python - 我可以在 Python 的正则表达式中使用变量而不是常量吗
- mysql - 该字符串包含由连字符('-')分隔的多个子字符串。如何比较子字符串并删除重复的子字符串?
- maven - 如何关闭 intelij idea maven run debug console 的右侧分成两部分?
- ios - 基于用户在 ToDo DatePicker (Swift & SwiftUI) 中设置的日期时间的 iOS 本地通知
- google-cloud-firestore - 无法从 firestore 创建名为“timestamp”的字段的架构列
- javascript - 在 Quasar (vue) 中使用解析从数据中获取数据 - 返回未定义
- javascript - 远程通知不会触发notificationclick
- docker - 如何在来宾操作系统和 Docker 容器之间绑定目录?
- php - Symfony 实体属性访问问题 无法确定访问类型
- vb.net - 如何将 PictureBox 中的图像保存到我的数据库中?