我的MVC应用程序允许一部分用户在表中插入/编辑记录,因为我使用的是Windows身份验证,所以我可以“免费”获取他们的samaccountnames,并且可以将这些记录插入到“Last Updated By”字段中。提到的记录。
我的应用程序中最重要(和常用)的一个视图将显示每页50-100条记录的列表,但我不想显示它们的samaccountnames。我希望他们能够从Active Directory获得更加用户友好的显示名称。
我在这里看到几篇帖子建议将AD链接到SQL,但这需要在SQL服务器上安装我不想做的组件。相反,我正在考虑创建以下接口和派生类:
public interface IUserInformationStore
{
UserInformation FindBySamAccountName(string samAccountName)
}
public class ActiveDirectoryStore
{
HashSet<UserInformation> _cache;
public UserInformation FindBySamAccountName(string samAccountName)
{
// Look for samaccountname in _cache and if not found
// retrieve information from AD with DirectorySearcher.
// Store information in _cache and return correct user.
}
我现在的问题是如何访问此信息。我在考虑使用Ninject的ToSingleton,但我怀疑这可能是“Singleton Per Worker进程”。也许Cache可能是一个更好的地方。但访问该对象的最佳方式是什么?具有静态属性的静态类,它检查它是否已经在Cache中,否则初始化它,并返回该对象?
还是有更好的解决方法吗?
答案 0 :(得分:0)
我最终尝试了两种解决方案:
kernel.Bind<IUserRepository>().To<ActiveDirectoryUserRepository>().InSingletonScope().WithConstructorArgument("rootPath", "LDAP://dc=tessdata,dc=no");
public static MvcHtmlString GetDisplayNameSingleton(this HtmlHelper htmlHelper, string samAccountName)
{
var userRepository = DependencyResolver.Current.GetService<IUserRepository>();
return new MvcHtmlString(userRepository != null ? userRepository.FindByUsername(samAccountName).DisplayName : "Ukjent");
}
kernel.Bind<IUserRepository>().To<ActiveDirectoryUserRepository>().WithConstructorArgument("rootPath", "LDAP://dc=tessdata,dc=no");
public static MvcHtmlString GetDisplayName(this HtmlHelper htmlHelper, string samAccountName)
{
if (HttpRuntime.Cache["UserRepository"] == null)
{
var newUserRepository = DependencyResolver.Current.GetService<IUserRepository>();
HttpRuntime.Cache.Add("UserRepository", newUserRepository, null, DateTime.MaxValue,
TimeSpan.FromMinutes(20), CacheItemPriority.Default, null);
}
var userRepository = HttpRuntime.Cache["UserRepository"] as IUserRepository;
return new MvcHtmlString(userRepository != null ? userRepository.FindByUsername(samAccountName).DisplayName : "Ukjent");
}
第二种方法明显更快,特别是在缓存存储库的第一次调用之后。您也可以更好地控制缓存。第一种方法将保留在内存中,直到应用程序重新启动。
我不确定两种情况下的最佳做法。