문제

저는 ASP.NET MVC 웹 사이트에 대한 사용자 정의 멤버십 제공 업체를 만들고 있습니다. 제공 업체는 더 큰 라이브러리의 일부로 별도의 클래스로 만들어지고 있습니다. 백엔드 데이터 스토어는 XML 파일 또는 SQL 데이터베이스 일 수 있으므로 유연해야합니다. 나의 초기 생각은 데이터 스토어에 대한 인터페이스를 만들고 종속성 주입을 사용하여 제공자에 이것을 주입하는 것이 었습니다.

최종 결과는 개발자가 데이터 스토어 인터페이스를 상속하고 데이터를 업데이트하는 데 필요한 방법을 제공 할 수 있으며, 이는 사용자 정의 멤버십 제공 업체가 사용합니다.

그러나 내 자신의 기술 부족을 통해 웹 사이트에 추가 할 때 수업을 멤버십 제공 업체에 주입하는 방법을 알 수 없습니까? 데이터 스토어를 공급자에 연결하려면 무엇을해야합니까? 웹 사이트에서 이것을 활성화하는 가장 간단한 방법은 무엇입니까?

도움이 되었습니까?

해결책

사용자 정의 멤버십 제공 업체를u003Cmembership> web.config 파일의 요소는 종속성 주입과 관련된 문제를 볼 수 있습니다.

공급자는 프레임 워크에 의해 건설되고 관리되며, 그 건설을 가로 채기 위해 추가 의존성 주입을 제공 할 수있는 기회는 없습니다. IDataStore 상호 작용.

내 가정이 정확하다면, 당신이 할 수있는 일은 Initialize() 사용자 정의 제공 업체의 메소드 및 종속성 주입을 수행하십시오. 공급자 구성에 사용자 정의 이름/값 설정을 가리키는 유형을 가리킬 수 있습니다. IDataStore, 사전의 일부로 전달됩니다. Initialize() 방법.

그런 다음 데이터 스토어 유형의 인스턴스를 활성화하여 해당 속성으로 설정합니다.

public class MyMembershipProvider : MembershipProvider
{
    public IDataStore DataStore
    {
        get;
        set;
    }

    public override Initialize(string name, NameValueCollection config)
    {
        var dataStoreType = config["dataStoreProvider"];
        if (!String.IsNullOrEmpty(dataStoreType))
        {
            var type = Type.GetType(dataStoreType);
            DataStore = (IDataStore) Activator.CreateInstance(type);
        }
    }
}

Initialize() 공급자의 인스턴스를 구성한 후 프레임 워크에서 호출되므로 이와 같은 추가 설정 작업을 수행하기에 완벽한 장소입니다.

테스트 시나리오의 경우 테스트에서 직접 구성 할 수 있으므로 Data Store 속성을 제공자 인스턴스 자체에 설정합니다.

다른 팁

이것이 더 좋지 않습니까? MVC3 및 Ninject와 함께 사용합니다. 사용자 정의 멤버십 제공 업체 클래스에 속성을 추가하는 것으로 충분합니다. "System.Web.mvc 사용"을 추가해야합니다. 위에.

public IRepository Repository
{
    get
    {
        return DependencyResolver.Current.GetService<IRepository>();
    }
}

내가 본 가장 간단한 종속성 주입 방법 (실제로 지금까지 사용한 유일한 방법은 부양 클래스의 생성자가 인터페이스를 매개 변수로 가져 와서 개인에 할당하는 것입니다. 필드. 원한다면 "기본"생성자를 추가 할 수도 있습니다.이 생성자는 기본값을 가진 첫 번째 제품에 체인됩니다.

단순화되면 다음과 같이 보일 것입니다.

public class DependentClass
{
    private IDataStore _store;

    // Use this constructor when you want strict control of the implementation
    public DependentClass(IDataStore store)
    {
         this._store = store;
    }

    // Use this constructor when you don't want to create an IDataStore instance
    // manually every time you create a DependentClass instance
    public DependentClass() : this(new DefaultDataStore()) { }
}

이 개념을 "생성자 체인"이라고하며 웹에는이를 수행하는 방법에 대한 기사가 많이 있습니다. 나는 찾았다 이 튜토리얼 DI 패턴의 매우 설명.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top