0

我是 StructureMap 的新手,遇到以下问题,这似乎与其他人遇到的问题相反。我有一个通用UnitOfWorkClass定义如下:

public class UnitOfWork<TContext> : IUnitOfWork
    where TContext : IContext, new()
{
    ....
}

但是,如果我对具体实例有几种不同的可能性,我对如何注册这个来解决这个问题感到困惑。

我已经看到很多人们拥有通用接口的例子,例如:

StructureMap 使用 Scan 自动注册泛型类型

所以我想这个问题可能会被问到我是否也需要重新审视我的设计!

非常感谢!

# 编辑可能的解决方案?

所以我有一个类,它将两个参数带入构造函数:

public MyClass(IUnitOfWork firstConstructor, 
    IUnitOfWork secondConstructor)
{
    ...
}

然后,随着我的对象图的构建,我执行以下操作:

ObjectFactory.Initialize(cfg =>
{
    var firstContext = cfg.For<IContext>().Use<MyFirstContext>();
    var secondContext = cfg.For<IContext>().Use<MySecondContext>();

    var firstUnitOfWork =
        cfg.For<IUnitOfWork>().Use<UnitOfWork<MyFirstContext>>()
        .Ctor<IContext>().Is(firstContext);

    var secondUnitOfWork =
        cfg.For<IUnitOfWork>().Use<UnitOfWork<MySecondContext>>()
        .Ctor<IContext>().Is(secondContext);

    cfg.For<IMyClass>().Use<MySecondContext>()
        .Ctor<IUnitOfWork>("firstConstructor").Is(firstUnitOfWork)
        .Ctor<IUnitOfWork>("secondConstructor").Is(secondUnitOfWork);
});

所以我在这里所做的是:

  • 解决了我对 IContext 的依赖并将它们存储在变量中
  • 将解析的 IContext 注入到我的 IUnitOfWork 构造函数中
  • 然后我可以正确解析正确的通用 UnitOfWork 构造函数

感觉不是很完美,但我认为这适合我的需求......

4

1 回答 1

2

我不完全确定我理解你想要什么,但如果你在 IUnitOfWork 中使接口通用,那么你可以像这样注册:

ObjectFactory.Initialize(x =>
{
    x.For(typeof(IUnitOfWork<>)).Use(typeof(UnitOfWork<>));
}

StructureMap 将为实现类提供正确的类型。这能满足你的需要吗?

于 2013-07-23T12:48:04.503 回答