의존성 주입 및 ASP.NET 회원 수당
-
20-09-2019 - |
문제
저는 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 패턴의 매우 설명.