1

我們的工作倉庫一般都是CRUD,分爲ICreatable,IRetrievable,IUpdatableIDeletable各一個。檢索行爲在檢索中使用對象的PK。通常,我們最終會得到另一個子接口來處理倉庫CRUD行爲之外的方法。它看起來像這樣:如何使StructureMap自動註冊基礎接口?

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注射時,我問一個IUserRepositoryIRetrievable<User>,而無需配置每個的4個手動。如果我決定代替ICreatable<User>而不是CreatableUserRepository,我希望能夠覆蓋一個,但通常我只是希望它儘可能地在樹上走。

這是可行的嗎?

回答

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>(); 
     }); 
    }