2012-02-22 60 views
2

我創建了一個自定義的成員提供如何注入一個倉庫到使用AutoFac

public class MyMembership : MembershipProvider 
{ 
    private IRepository<User> Repo; 
} 

一個自定義的MembershipProvider我想出如何使用autofac注入MyMembership:

builder.Register(c => Membership.Provider); 

然而,這並未」如果我有一個構造函數需要一個IRepository(它只調用無參數的構造函數),那麼就工作了。我試着從一個私有字段變成一個公有屬性,然後調用:

builder.Register(c => Membership.Provider).AutoWireProperties(); 

問題是,MembershipProvider沒有Repo屬性,它只是我的類。

目前,我沒有注入任何東西,只是創建了一個空的構造函數,我只是簡單地創建了一個新的Repo實例。但它使測試更加困難。

那麼,有沒有什麼辦法可以使用AutoFac來注入我的MyMembership,並讓它使用注入的Repo?

+1

你如何從成員資格繼承?這個類是靜態的。 – Jehof 2012-02-22 14:41:01

+0

我的不好,它是MembershipProvider,不是我從中得到的成員資格。好趕上@Jehof – taylonr 2012-02-22 14:52:34

回答

1

您還應該註冊IRepository<User>。但要做到這一點,您需要通過具體的類型訪問自定義提供程序。

因此,像這樣:

builder.Register(c => Membership.Provider); 
builder.Register(c => ((MyMembership) Membership.Provider).Repo); 

這可以作出更好如下(通過註冊您的實現,避免石膏),但不知道它如何再與ASP.NET和其供應商的管理適合於生命週期:

builder.RegisterType<MyMembership>(); 
builder.Register(c => c.Resolve<MyMembership>()).As<MembershipProvider>(); 
builder.Register(c => c.Resolve<MyMembership>().Repo); 

編輯:

但是從設計的角度來看,它看起來像你的MyMembership類對依賴IRepository<User>,爲此這樣的事情可能是最好的:

builder.RegisterType<YourRepositoryImplementation>().As<IRepository<User>>(); 
builder.RegisterType<MyMembership>(); 
builder.Register(c => c.Resolve<MyMembership>()).As<MembershipProvider>(); 

這種方式需要IRepository將被注入到MyMembership,也可用於其它組件的直接消費,他們都有被處理的生命週期管理Autofac。

+0

太棒了。我已經在其他地方註冊了IRepository 。當我今晚回到家時,我會試試這些,謝謝。 – taylonr 2012-02-22 14:51:18

+1

剛做了一些閱讀自定義MembershipProviders,它似乎ASP.NET實例化你的實例,所以上面的最後2個選項將無法正常工作,至少不正確。您將有一個由ASP.NET構建的實例(由'Membership.Provider'返回)和由Autofac構建的實例。 你最好的選擇可能是第一個選項。 – Tyson 2012-02-22 15:00:14

+1

確認,但後來我看到你的問題,你想讓由ASP.NET構建的自定義提供程序注入已註冊的'IRepository '實例。除非ASP.NET爲成員資格提供者實例提供一些鉤子,否則您可能必須在MyMembership構造函數中使用Service Locator反模式來解析IRepository 。 – Tyson 2012-02-22 15:03:24

0

這種情況是完全可能的。在我Bootstrapper.cs類,我只是注入性質爲商這樣:

 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

     var lifetimeScope = DependencyResolver.Current.GetService<ILifetimeScope>(); 
     lifetimeScope.InjectProperties(Membership.Provider); 
     lifetimeScope.InjectProperties(Roles.Provider); 

我也有以下幾點:

 builder.Register(context => Membership.Provider).ExternallyOwned(); 
     builder.Register(context => Roles.Provider).ExternallyOwned(); 

但我不完全知道它的甚至是必要的。我相信Register在你想要將提供者注入類型的情況下。

2

這是一個老帖子,所以我只是在這裏張貼我的解決方案,因爲我有點與自己鬥爭。

公共類AutofacBootstrapperImp:AutofacBootstrapper

在你autofac建設者設置包括註冊你的界面

builder.RegisterType<YourRepo>().As<IRepository<User>>().SingleInstance(); 

公共類CustomMembershipProvider:的MembershipProvider

過載init()方法,並使用autofac範圍解決您的問題

private IRepository<User> Repo; 

    public override void Initialize(string name, NameValueCollection config) 
    { 
     // use autoface scope to resole service 
     using (var scope = AutofacBootstrapper.Container.BeginLifetimeScope()) 
     { 
      Repo = scope.Resolve<IRepository<User>>(); 
     } 

     if (config == null) 
      throw new ArgumentNullException("config"); 

     // Initialize the abstract base class. 
     base.Initialize(name, config); 
    } 
相關問題