如何使StructureMap自动注册基接口?

时间:2011-11-17 19:33:31

标签: c# dependency-injection inversion-of-control structuremap

我们的工作库通常是CRUD,分为ICreatableIRetrievableIUpdatableIDeletable各一个。检索行为在其检索中使用对象的PK。通常,我们最终将使用另一个子接口来处理存储库的CRUD行为之外的方法。它看起来像这样:

public interface IUserRepository : ICreatable<User>, IRetrievable<User>, IUpdatable<User>
{
    IEnumerable<User> GetUsersWithoutEmail ();
}

public class UserRepository : IUserRepository
{
    // implement members...
}

在我们特别需要GetUsersWithoutEmail的地方,我们将注入IUserRepository。其他需要IRetrievable<User>的地方目前获得IUserRepository,因为我不知道如何解决这个问题。

我希望能做的事情与此类似:

ObjectFactory.Initialize (x => x.For<IUserRepository> ().IncludeBaseInterfaces ().Use <UserRepository> ());

当我要求UserRepository IUserRepository时,我希望IRetrievable<User>注入ICreatable<User>,而无需手动配置4中的每一个。如果我决定CreatableUserRepository需要成为{{1}},我希望能够覆盖一个,但通常我只是希望它尽可能地走在树上。

这可行吗?

1 个答案:

答案 0 :(得分:2)

我认为你最终需要某种疯狂的逻辑对象来帮助你在StructureMap的顶层处理这类事情 - 我不知道有任何功能可以为你提供这种条件处理。

所以你会看到类似的东西:

public class NestedInheritanceConvention : IRegistrationConvention
{
    public void Process (Type type, Registry registry)
    {
        if (type.IsInterface)   
            return;

        if (type.IsAbstract)    
            return;

        if (type.IsSubclassOf (typeof(Registry)))
            return;

        foreach (var iface in type.GetInterfaces ())
        {
            registry.For (iface).Use (type);
        }
    }
}

这将使您的StructureMap调用看起来像:

    public StructureMapRegistry ()
    {
        Scan (x => 
        {
            x.Convention<NestedInheritanceConvention> ();
        });
    }