ASP.NET에서 정적 함수를 사용하는 것이 가장 좋습니까?
-
12-09-2019 - |
문제
정적 기능을 언제 사용 해야하는지, 언제 ASP.NET에 있지 않습니까?
성능과 같은 다양한 측면에서, 모범 사례 등 (그리고 더 많은 것이 관련이 있다고 생각하는 것)을 사용하는 데있어 장점과 단점은 무엇입니까?
해결책
단점 :
- 스레딩 문제 (정적 함수는 인스턴스를 호출 할 필요가 없으므로 코드의 다른 부분에서 쉽게 호출 할 수 있으며 공유 상태로 읽거나 쓰면이 상태가 멀티 스레드 환경에서 손상 될 수 있습니다. asp.net과 같은
- 단위 테스트가 어렵습니다 (정적 함수가 객체 인스턴스가 필요하지 않으므로 생성자 주입이 불가능하다는 의미입니다.
장점 :
- 성능 (이것은 의심 스럽다 - 대부분의 경우 성능 이득은 코드의 다른 부분에 비해 완전히 무시할 수 있습니다).
다른 팁
모든 응용 프로그램과 마찬가지로 정적이 적절한 솔루션 인 상황이 분명히 있습니다. 요청 범위가 아닌 애플리케이션 범위에서 살아야 할 객체가있을 때마다 정적이어야하며 정적 메소드를 사용하여 액세스하고 조작해야합니다.
예를 들어, 다음은 ASP.NET 응용 프로그램에 대해 최근에 쓴 코드 스 니펫이 있습니다. 시리얼 라이저는 생성 비용이 많이 들며 응용 프로그램이 살아남는 한 유형 당 동일한 유형을 재사용 할 수 있으므로 각 요청 스레드에서 시간을 낭비 할 필요가 없습니다.
(메모: 이것은 정적 측면을 보여주기 위해 제거되었습니다)
public class XmlSerializerUtility
{
private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>();
private static object sync = new object();
public static T Deserialize<T>(string input)
{
XmlSerializer xs = GetSerializer(typeof(T));
using (StringReader sr = new StringReader(input))
{
return (T)xs.Deserialize(sr);
}
}
public static XmlDocument Serialize(object input)
{
XmlDocument doc = new XmlDocument();
XmlSerializer xs = GetSerializer(input.GetType());
using (MemoryStream stream = new MemoryStream())
{
xs.Serialize(stream, input);
stream.Position = 0;
doc.Load(stream);
}
return doc;
}
private static XmlSerializer GetSerializer(Type type)
{
lock (sync)
{
XmlSerializer xs = null;
if (!serializers.ContainsKey(type))
{
xs = new XmlSerializer(type);
serializers.Add(type, xs);
}
else
{
xs = serializers[type];
}
return xs;
}
}
}
정적 방법의 유일한 주요 단점은 거의 전적으로 단위가 아닌 테스트 가능하다는 것입니다. 이 방법의 사용자는 콘크리트 방법에 결합해야하며 추상화에 결합 할 수 없으므로 불가능하지는 않더라도 가짜 또는 조롱을 어렵게 만듭니다.
그러나 코드에 따라 문제가 될 수도 있고 아닐 수도 있습니다.
당신이 조심하고 싶은 또 다른 것은 정적 데이터가 서버에 대한 모든 요청에서 보편적이라는 것입니다.
제휴하지 않습니다 StackOverflow