我们的工作库通常是CRUD,分为ICreatable
,IRetrievable
,IUpdatable
和IDeletable
各一个。检索行为在其检索中使用对象的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}},我希望能够覆盖一个,但通常我只是希望它尽可能地走在树上。
这可行吗?
答案 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> ();
});
}