我在unity中解决实例的问题
我已经这样设置了容器:
var token = new SecurityToken();
token.Token = "Test";
token.Value = "Test";
var passport = new PassportContext();
passport.Permissions = new SecurityPermissions { Add = true, Change = true, Inquiry = true, Delete = true };
_unityContainer = new UnityContainer();
_unityContainer.RegisterInstance<PassportContext>(passport, new ContainerControlledLifetimeManager());
_unityContainer.RegisterInstance<SecurityToken>(token, new ContainerControlledLifetimeManager());
_unityContainer.RegisterType<IWorksheetRepository, WorksheetRepository>();
PassportContext
和SecurityToken
是存储库中web服务调用获取数据所必需的。
我像这样解决我的WorksheetRepository
:
UnityContainer.Resolve<IWorksheetRepository>();
实例化了我的WorksheetRepository
:
public sealed class WorksheetRepository : IWorksheetRepository
{
private PassportContext _passportContext;
private SecurityToken _token;
public WorksheetRepository(PassportContext passportContext, SecurityToken token)
{
_passportContext = passportContext;
_token = token;
}
}
现在,我的问题是,在WorksheetRepository
构造函数中,PassportContext
和SecurityToken
都被实例化了,但所有属性都处于默认值,而不是我在设置中设置的属性。我将它们设置为单例,所以当我解析IWorksheetRepository
时,我的单例不应该被注入到我的WorksheetRepository
实现中吗?我是不是漏掉了什么关于团结的东西?
一点背景知识——我正在努力遵循最佳实践。我知道你的大多数应用程序应该忽略你的Unity容器,它应该从应用程序的根解决依赖关系。这是我试图遵循的模式,尽管这是一个单元测试。
看一下这个例子,我在这里使用了InjectionProperty来提供实例。
public class SecurityPermissions
{
public bool Add { get; set; }
public bool Change { get; set; }
}
public class PassportContext
{
public SecurityPermissions MyProperty { get; set; }
}
[TestMethod]
public void YourUnitTest()
{
using (var c = new UnityContainer())
{
var sp = new SecurityPermissions() { Add = true, Change = true };
c.RegisterType(typeof(PassportContext), new InjectionProperty("MyProperty", sp));
var pc = c.Resolve<PassportContext>();